Merge branch 'main' into production

This commit is contained in:
Mouse Reeve 2021-12-04 16:58:07 -08:00
commit 620a22bde0
66 changed files with 2152 additions and 1008 deletions

1
.gitignore vendored
View file

@ -4,6 +4,7 @@
*.swp
**/__pycache__
.local
/nginx/nginx.conf
# VSCode
/.vscode

View file

@ -22,6 +22,11 @@ class ActivityStream(RedisStore):
stream_id = self.stream_id(user)
return f"{stream_id}-unread"
def unread_by_status_type_id(self, user):
"""the redis key for this user's unread count for this stream"""
stream_id = self.stream_id(user)
return f"{stream_id}-unread-by-type"
def get_rank(self, obj): # pylint: disable=no-self-use
"""statuses are sorted by date published"""
return obj.published_date.timestamp()
@ -35,6 +40,10 @@ class ActivityStream(RedisStore):
for user in self.get_audience(status):
# add to the unread status count
pipeline.incr(self.unread_id(user))
# add to the unread status count for status type
pipeline.hincrby(
self.unread_by_status_type_id(user), get_status_type(status), 1
)
# and go!
pipeline.execute()
@ -55,6 +64,7 @@ class ActivityStream(RedisStore):
"""load the statuses to be displayed"""
# clear unreads for this feed
r.set(self.unread_id(user), 0)
r.delete(self.unread_by_status_type_id(user))
statuses = self.get_store(self.stream_id(user))
return (
@ -75,6 +85,14 @@ class ActivityStream(RedisStore):
"""get the unread status count for this user's feed"""
return int(r.get(self.unread_id(user)) or 0)
def get_unread_count_by_status_type(self, user):
"""get the unread status count for this user's feed's status types"""
status_types = r.hgetall(self.unread_by_status_type_id(user))
return {
str(key.decode("utf-8")): int(value) or 0
for key, value in status_types.items()
}
def populate_streams(self, user):
"""go from zero to a timeline"""
self.populate_store(self.stream_id(user))
@ -460,7 +478,7 @@ def remove_status_task(status_ids):
@app.task(queue=HIGH)
def add_status_task(status_id, increment_unread=False):
"""add a status to any stream it should be in"""
status = models.Status.objects.get(id=status_id)
status = models.Status.objects.select_subclasses().get(id=status_id)
# we don't want to tick the unread count for csv import statuses, idk how better
# to check than just to see if the states is more than a few days old
if status.created_date < timezone.now() - timedelta(days=2):
@ -507,3 +525,20 @@ def handle_boost_task(boost_id):
stream.remove_object_from_related_stores(boosted, stores=audience)
for status in old_versions:
stream.remove_object_from_related_stores(status, stores=audience)
def get_status_type(status):
"""return status type even for boosted statuses"""
status_type = status.status_type.lower()
# Check if current status is a boost
if hasattr(status, "boost"):
# Act in accordance of your findings
if hasattr(status.boost.boosted_status, "review"):
status_type = "review"
if hasattr(status.boost.boosted_status, "comment"):
status_type = "comment"
if hasattr(status.boost.boosted_status, "quotation"):
status_type = "quotation"
return status_type

View file

@ -9,6 +9,8 @@ from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from bookwyrm import models
from bookwyrm.models.fields import ClearableFileInputWithWarning
from bookwyrm.models.user import FeedFilterChoices
class CustomForm(ModelForm):
@ -147,6 +149,17 @@ class EditUserForm(CustomForm):
"preferred_language",
]
help_texts = {f: None for f in fields}
widgets = {
"avatar": ClearableFileInputWithWarning(
attrs={"aria-describedby": "desc_avatar"}
),
"name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
"summary": forms.Textarea(attrs={"aria-describedby": "desc_summary"}),
"email": forms.EmailInput(attrs={"aria-describedby": "desc_email"}),
"discoverable": forms.CheckboxInput(
attrs={"aria-describedby": "desc_discoverable"}
),
}
class LimitedEditUserForm(CustomForm):
@ -160,6 +173,16 @@ class LimitedEditUserForm(CustomForm):
"discoverable",
]
help_texts = {f: None for f in fields}
widgets = {
"avatar": ClearableFileInputWithWarning(
attrs={"aria-describedby": "desc_avatar"}
),
"name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
"summary": forms.Textarea(attrs={"aria-describedby": "desc_summary"}),
"discoverable": forms.CheckboxInput(
attrs={"aria-describedby": "desc_discoverable"}
),
}
class DeleteUserForm(CustomForm):
@ -174,6 +197,18 @@ class UserGroupForm(CustomForm):
fields = ["groups"]
class FeedStatusTypesForm(CustomForm):
class Meta:
model = models.User
fields = ["feed_status_types"]
help_texts = {f: None for f in fields}
widgets = {
"feed_status_types": widgets.CheckboxSelectMultiple(
choices=FeedFilterChoices,
),
}
class CoverForm(CustomForm):
class Meta:
model = models.Book
@ -196,6 +231,51 @@ class EditionForm(CustomForm):
"connector",
"search_vector",
]
widgets = {
"title": forms.TextInput(attrs={"aria-describedby": "desc_title"}),
"subtitle": forms.TextInput(attrs={"aria-describedby": "desc_subtitle"}),
"description": forms.Textarea(
attrs={"aria-describedby": "desc_description"}
),
"series": forms.TextInput(attrs={"aria-describedby": "desc_series"}),
"series_number": forms.TextInput(
attrs={"aria-describedby": "desc_series_number"}
),
"languages": forms.TextInput(
attrs={"aria-describedby": "desc_languages_help desc_languages"}
),
"publishers": forms.TextInput(
attrs={"aria-describedby": "desc_publishers_help desc_publishers"}
),
"first_published_date": forms.SelectDateWidget(
attrs={"aria-describedby": "desc_first_published_date"}
),
"published_date": forms.SelectDateWidget(
attrs={"aria-describedby": "desc_published_date"}
),
"cover": ClearableFileInputWithWarning(
attrs={"aria-describedby": "desc_cover"}
),
"physical_format": forms.Select(
attrs={"aria-describedby": "desc_physical_format"}
),
"physical_format_detail": forms.TextInput(
attrs={"aria-describedby": "desc_physical_format_detail"}
),
"pages": forms.NumberInput(attrs={"aria-describedby": "desc_pages"}),
"isbn_13": forms.TextInput(attrs={"aria-describedby": "desc_isbn_13"}),
"isbn_10": forms.TextInput(attrs={"aria-describedby": "desc_isbn_10"}),
"openlibrary_key": forms.TextInput(
attrs={"aria-describedby": "desc_openlibrary_key"}
),
"inventaire_id": forms.TextInput(
attrs={"aria-describedby": "desc_inventaire_id"}
),
"oclc_number": forms.TextInput(
attrs={"aria-describedby": "desc_oclc_number"}
),
"ASIN": forms.TextInput(attrs={"aria-describedby": "desc_ASIN"}),
}
class AuthorForm(CustomForm):
@ -214,6 +294,28 @@ class AuthorForm(CustomForm):
"librarything_key",
"goodreads_key",
]
widgets = {
"name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
"aliases": forms.TextInput(attrs={"aria-describedby": "desc_aliases"}),
"bio": forms.Textarea(attrs={"aria-describedby": "desc_bio"}),
"wikipedia_link": forms.TextInput(
attrs={"aria-describedby": "desc_wikipedia_link"}
),
"born": forms.SelectDateWidget(attrs={"aria-describedby": "desc_born"}),
"died": forms.SelectDateWidget(attrs={"aria-describedby": "desc_died"}),
"oepnlibrary_key": forms.TextInput(
attrs={"aria-describedby": "desc_oepnlibrary_key"}
),
"inventaire_id": forms.TextInput(
attrs={"aria-describedby": "desc_inventaire_id"}
),
"librarything_key": forms.TextInput(
attrs={"aria-describedby": "desc_librarything_key"}
),
"goodreads_key": forms.TextInput(
attrs={"aria-describedby": "desc_goodreads_key"}
),
}
class ImportForm(forms.Form):
@ -288,12 +390,37 @@ class SiteForm(CustomForm):
class Meta:
model = models.SiteSettings
exclude = []
widgets = {
"instance_short_description": forms.TextInput(
attrs={"aria-describedby": "desc_instance_short_description"}
),
"require_confirm_email": forms.CheckboxInput(
attrs={"aria-describedby": "desc_require_confirm_email"}
),
"invite_request_text": forms.Textarea(
attrs={"aria-describedby": "desc_invite_request_text"}
),
}
class AnnouncementForm(CustomForm):
class Meta:
model = models.Announcement
exclude = ["remote_id"]
widgets = {
"preview": forms.TextInput(attrs={"aria-describedby": "desc_preview"}),
"content": forms.Textarea(attrs={"aria-describedby": "desc_content"}),
"event_date": forms.SelectDateWidget(
attrs={"aria-describedby": "desc_event_date"}
),
"start_date": forms.SelectDateWidget(
attrs={"aria-describedby": "desc_start_date"}
),
"end_date": forms.SelectDateWidget(
attrs={"aria-describedby": "desc_end_date"}
),
"active": forms.CheckboxInput(attrs={"aria-describedby": "desc_active"}),
}
class ListForm(CustomForm):
@ -318,6 +445,9 @@ class EmailBlocklistForm(CustomForm):
class Meta:
model = models.EmailBlocklist
fields = ["domain"]
widgets = {
"avatar": forms.TextInput(attrs={"aria-describedby": "desc_domain"}),
}
class IPBlocklistForm(CustomForm):

View file

@ -0,0 +1,32 @@
# Generated by Django 3.2.5 on 2021-11-24 10:15
import bookwyrm.models.user
import django.contrib.postgres.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0118_alter_user_preferred_language"),
]
operations = [
migrations.AddField(
model_name="user",
name="feed_status_types",
field=django.contrib.postgres.fields.ArrayField(
base_field=models.CharField(
choices=[
("review", "Reviews"),
("comment", "Comments"),
("quotation", "Quotations"),
("everything", "Everything else"),
],
max_length=10,
),
default=bookwyrm.models.user.get_feed_filter_choices,
size=8,
),
),
]

View file

@ -4,11 +4,12 @@ from urllib.parse import urlparse
from django.apps import apps
from django.contrib.auth.models import AbstractUser, Group
from django.contrib.postgres.fields import CICharField
from django.contrib.postgres.fields import ArrayField, CICharField
from django.core.validators import MinValueValidator
from django.dispatch import receiver
from django.db import models, transaction
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from model_utils import FieldTracker
import pytz
@ -27,6 +28,19 @@ from .federated_server import FederatedServer
from . import fields, Review
FeedFilterChoices = [
("review", _("Reviews")),
("comment", _("Comments")),
("quotation", _("Quotations")),
("everything", _("Everything else")),
]
def get_feed_filter_choices():
"""return a list of filter choice keys"""
return [f[0] for f in FeedFilterChoices]
def site_link():
"""helper for generating links to the site"""
protocol = "https" if USE_HTTPS else "http"
@ -128,6 +142,13 @@ class User(OrderedCollectionPageMixin, AbstractUser):
show_suggested_users = models.BooleanField(default=True)
discoverable = fields.BooleanField(default=False)
# feed options
feed_status_types = ArrayField(
models.CharField(max_length=10, blank=False, choices=FeedFilterChoices),
size=8,
default=get_feed_filter_choices,
)
preferred_timezone = models.CharField(
choices=[(str(tz), str(tz)) for tz in pytz.all_timezones],
default=str(pytz.utc),

View file

@ -49,6 +49,28 @@ def get_font(font_name, size=28):
return font
def get_wrapped_text(text, font, content_width):
"""text wrap length depends on the max width of the content"""
low = 0
high = len(text)
try:
# ideal length is determined via binary search
while low < high:
mid = math.floor(low + high)
wrapped_text = textwrap.fill(text, width=mid)
width = font.getsize_multiline(wrapped_text)[0]
if width < content_width:
low = mid
else:
high = mid - 1
except AttributeError:
wrapped_text = text
return wrapped_text
def generate_texts_layer(texts, content_width):
"""Adds text for images"""
font_text_zero = get_font("bold", size=20)
@ -63,7 +85,8 @@ def generate_texts_layer(texts, content_width):
if "text_zero" in texts and texts["text_zero"]:
# Text one (Book title)
text_zero = textwrap.fill(texts["text_zero"], width=72)
text_zero = get_wrapped_text(texts["text_zero"], font_text_zero, content_width)
text_layer_draw.multiline_text(
(0, text_y), text_zero, font=font_text_zero, fill=TEXT_COLOR
)
@ -75,7 +98,8 @@ def generate_texts_layer(texts, content_width):
if "text_one" in texts and texts["text_one"]:
# Text one (Book title)
text_one = textwrap.fill(texts["text_one"], width=28)
text_one = get_wrapped_text(texts["text_one"], font_text_one, content_width)
text_layer_draw.multiline_text(
(0, text_y), text_one, font=font_text_one, fill=TEXT_COLOR
)
@ -87,7 +111,8 @@ def generate_texts_layer(texts, content_width):
if "text_two" in texts and texts["text_two"]:
# Text one (Book subtitle)
text_two = textwrap.fill(texts["text_two"], width=36)
text_two = get_wrapped_text(texts["text_two"], font_text_two, content_width)
text_layer_draw.multiline_text(
(0, text_y), text_two, font=font_text_two, fill=TEXT_COLOR
)
@ -99,7 +124,10 @@ def generate_texts_layer(texts, content_width):
if "text_three" in texts and texts["text_three"]:
# Text three (Book authors)
text_three = textwrap.fill(texts["text_three"], width=36)
text_three = get_wrapped_text(
texts["text_three"], font_text_three, content_width
)
text_layer_draw.multiline_text(
(0, text_y), text_three, font=font_text_three, fill=TEXT_COLOR
)

View file

@ -14,7 +14,7 @@ VERSION = "0.1.0"
PAGE_LENGTH = env("PAGE_LENGTH", 15)
DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English")
JS_CACHE = "3eb4edb1"
JS_CACHE = "3891b373"
# email
EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend")

View file

@ -115,6 +115,21 @@ input[type=file]::file-selector-button:hover {
color: #363636;
}
summary::marker {
content: none;
}
.detail-pinned-button summary {
position: absolute;
right: 0;
}
.detail-pinned-button form {
float: left;
width: -webkit-fill-available;
margin-top: 1em;
}
/** Shelving
******************************************************************************/

View file

@ -45,6 +45,13 @@ let BookWyrm = new class {
'change',
this.disableIfTooLarge.bind(this)
));
document.querySelectorAll('[data-duplicate]')
.forEach(node => node.addEventListener(
'click',
this.duplicateInput.bind(this)
))
}
/**
@ -113,9 +120,44 @@ let BookWyrm = new class {
* @return {undefined}
*/
updateCountElement(counter, data) {
let count = data.count;
const count_by_type = data.count_by_type;
const currentCount = counter.innerText;
const count = data.count;
const hasMentions = data.has_mentions;
const allowedStatusTypesEl = document.getElementById('unread-notifications-wrapper');
// If we're on the right counter element
if (counter.closest('[data-poll-wrapper]').contains(allowedStatusTypesEl)) {
const allowedStatusTypes = JSON.parse(allowedStatusTypesEl.textContent);
// For keys in common between allowedStatusTypes and count_by_type
// This concerns 'review', 'quotation', 'comment'
count = allowedStatusTypes.reduce(function(prev, currentKey) {
const currentValue = count_by_type[currentKey] | 0;
return prev + currentValue;
}, 0);
// Add all the "other" in count_by_type if 'everything' is allowed
if (allowedStatusTypes.includes('everything')) {
// Clone count_by_type with 0 for reviews/quotations/comments
const count_by_everything_else = Object.assign(
{},
count_by_type,
{review: 0, quotation: 0, comment: 0}
);
count = Object.keys(count_by_everything_else).reduce(
function(prev, currentKey) {
const currentValue =
count_by_everything_else[currentKey] | 0
return prev + currentValue;
},
count
);
}
}
if (count != currentCount) {
this.addRemoveClass(counter.closest('[data-poll-wrapper]'), 'is-hidden', count < 1);
@ -368,4 +410,24 @@ let BookWyrm = new class {
);
}
}
duplicateInput (event ) {
const trigger = event.currentTarget;
const input_id = trigger.dataset['duplicate']
const orig = document.getElementById(input_id);
const parent = orig.parentNode;
const new_count = parent.querySelectorAll("input").length + 1
let input = orig.cloneNode();
input.id += ("-" + (new_count))
input.value = ""
let label = parent.querySelector("label").cloneNode();
label.setAttribute("for", input.id)
parent.appendChild(label)
parent.appendChild(input)
}
}();

View file

@ -187,6 +187,7 @@ let StatusCache = new class {
.forEach(item => BookWyrm.addRemoveClass(item, "is-hidden", false));
// Remove existing disabled states
button.querySelectorAll("[data-shelf-dropdown-identifier] button")
.forEach(item => item.disabled = false);

View file

@ -34,47 +34,41 @@
<div class="field">
<label class="label" for="id_name">{% trans "Name:" %}</label>
{{ form.name }}
{% for error in form.name.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.name.errors id="desc_name" %}
</div>
<div class="field">
<label class="label" for="id_aliases">{% trans "Aliases:" %}</label>
{{ form.aliases }}
<span class="help">{% trans "Separate multiple values with commas." %}</span>
{% for error in form.aliases.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.aliases.errors id="desc_aliases" %}
</div>
<div class="field">
<label class="label" for="id_bio">{% trans "Bio:" %}</label>
{{ form.bio }}
{% for error in form.bio.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.bio.errors id="desc_bio" %}
</div>
<p class="field"><label class="label" for="id_wikipedia_link">{% trans "Wikipedia link:" %}</label> {{ form.wikipedia_link }}</p>
{% for error in form.wikipedia_link.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.wikipedia_link.errors id="desc_wikipedia_link" %}
<div class="field">
<label class="label" for="id_born">{% trans "Birth date:" %}</label>
<input type="date" name="born" value="{{ form.born.value|date:'Y-m-d' }}" class="input" id="id_born">
{% for error in form.born.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.born.errors id="desc_born" %}
</div>
<div class="field">
<label class="label" for="id_died">{% trans "Death date:" %}</label>
<input type="date" name="died" value="{{ form.died.value|date:'Y-m-d' }}" class="input" id="id_died">
{% for error in form.died.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.died.errors id="desc_died" %}
</div>
</div>
<div class="column">
@ -82,33 +76,29 @@
<div class="field">
<label class="label" for="id_openlibrary_key">{% trans "Openlibrary key:" %}</label>
{{ form.openlibrary_key }}
{% for error in form.openlibrary_key.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.oepnlibrary_key.errors id="desc_oepnlibrary_key" %}
</div>
<div class="field">
<label class="label" for="id_inventaire_id">{% trans "Inventaire ID:" %}</label>
{{ form.inventaire_id }}
{% for error in form.inventaire_id.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.inventaire_id.errors id="desc_inventaire_id" %}
</div>
<div class="field">
<label class="label" for="id_librarything_key">{% trans "Librarything key:" %}</label>
{{ form.librarything_key }}
{% for error in form.librarything_key.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.librarything_key.errors id="desc_librarything_key" %}
</div>
<div class="field">
<label class="label" for="id_goodreads_key">{% trans "Goodreads key:" %}</label>
{{ form.goodreads_key }}
{% for error in form.goodreads_key.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.goodreads_key.errors id="desc_goodreads_key" %}
</div>
</div>

View file

@ -153,12 +153,21 @@
{# user's relationship to the book #}
<div class="block">
{% if user_shelfbooks.count > 0 %}
<h2 class="title is-5">
{% trans "You have shelved this edition in:" %}
</h2>
<ul>
{% for shelf in user_shelfbooks %}
<p>
{% blocktrans with path=shelf.shelf.local_path shelf_name=shelf.shelf.name %}This edition is on your <a href="{{ path }}">{{ shelf_name }}</a> shelf.{% endblocktrans %}
{% include 'snippets/shelf_selector.html' with current=shelf.shelf %}
</p>
<li class="box">
<a href="{{ shelf.shelf.local_path }}">{{ shelf.shelf.name }}</a>
<div class="mb-3">
{% include 'snippets/shelf_selector.html' with shelf=shelf.shelf class="is-small" readthrough=readthrough %}
</div>
</li>
{% endfor %}
</ul>
{% endif %}
{% for shelf in other_edition_shelves %}
<p>
{% blocktrans with book_path=shelf.book.local_path shelf_path=shelf.shelf.local_path shelf_name=shelf.shelf.name %}A <a href="{{ book_path }}">different edition</a> of this book is on your <a href="{{ shelf_path }}">{{ shelf_name }}</a> shelf.{% endblocktrans %}

View file

@ -12,106 +12,125 @@
<div class="columns">
<div class="column is-half">
<section class="block">
<h2 class="title is-4">{% trans "Metadata" %}</h2>
<h2 class="title is-4">
{% trans "Metadata" %}
</h2>
<div class="box">
<div class="field">
<label class="label" for="id_title">{% trans "Title:" %}</label>
<input type="text" name="title" value="{{ form.title.value|default:'' }}" maxlength="255" class="input" required="" id="id_title">
{% for error in form.title.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
<label class="label" for="id_title">
{% trans "Title:" %}
</label>
<input type="text" name="title" value="{{ form.title.value|default:'' }}" maxlength="255" class="input" required="" id="id_title" aria-describedby="desc_title">
{% include 'snippets/form_errors.html' with errors_list=form.title.errors id="desc_title" %}
</div>
<div class="field">
<label class="label" for="id_subtitle">{% trans "Subtitle:" %}</label>
<input type="text" name="subtitle" value="{{ form.subtitle.value|default:'' }}" maxlength="255" class="input" id="id_subtitle">
{% for error in form.subtitle.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
<label class="label" for="id_subtitle">
{% trans "Subtitle:" %}
</label>
<input type="text" name="subtitle" value="{{ form.subtitle.value|default:'' }}" maxlength="255" class="input" id="id_subtitle" aria-describedby="desc_subtitle">
{% include 'snippets/form_errors.html' with errors_list=form.subtitle.errors id="desc_subtitle" %}
</div>
<div class="field">
<label class="label" for="id_description">{% trans "Description:" %}</label>
<label class="label" for="id_description">
{% trans "Description:" %}
</label>
{{ form.description }}
{% for error in form.description.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.description.errors id="desc_description" %}
</div>
<div class="columns">
<div class="column is-two-thirds">
<div class="field">
<label class="label" for="id_series">{% trans "Series:" %}</label>
<input type="text" class="input" name="series" id="id_series" value="{{ form.series.value|default:'' }}">
{% for error in form.series.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
<label class="label" for="id_series">
{% trans "Series:" %}
</label>
<input type="text" class="input" name="series" id="id_series" value="{{ form.series.value|default:'' }}" aria-describedby="desc_series">
{% include 'snippets/form_errors.html' with errors_list=form.series.errors id="desc_series" %}
</div>
</div>
<div class="column is-one-third">
<div class="field">
<label class="label" for="id_series_number">{% trans "Series number:" %}</label>
<label class="label" for="id_series_number">
{% trans "Series number:" %}
</label>
{{ form.series_number }}
{% for error in form.series_number.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.series_number.errors id="desc_series_number" %}
</div>
</div>
</div>
<div class="field">
<label class="label" for="id_languages">{% trans "Languages:" %}</label>
<label class="label" for="id_languages">
{% trans "Languages:" %}
</label>
{{ form.languages }}
<span class="help">{% trans "Separate multiple values with commas." %}</span>
{% for error in form.languages.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
<span class="help" id="desc_languages_help">
{% trans "Separate multiple values with commas." %}
</span>
{% include 'snippets/form_errors.html' with errors_list=form.languages.errors id="desc_languages" %}
</div>
</div>
</section>
<section class="block">
<h2 class="title is-4">{% trans "Publication" %}</h2>
<h2 class="title is-4">
{% trans "Publication" %}
</h2>
<div class="box">
<div class="field">
<label class="label" for="id_publishers">{% trans "Publisher:" %}</label>
<label class="label" for="id_publishers">
{% trans "Publisher:" %}
</label>
{{ form.publishers }}
<span class="help">{% trans "Separate multiple values with commas." %}</span>
{% for error in form.publishers.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
<span class="help" id="desc_publishers_help">
{% trans "Separate multiple values with commas." %}
</span>
{% include 'snippets/form_errors.html' with errors_list=form.publishers.errors id="desc_publishers" %}
</div>
<div class="field">
<label class="label" for="id_first_published_date">{% trans "First published date:" %}</label>
<input type="date" name="first_published_date" class="input" id="id_first_published_date"{% if form.first_published_date.value %} value="{{ form.first_published_date.value|date:'Y-m-d' }}"{% endif %}>
{% for error in form.first_published_date.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
<label class="label" for="id_first_published_date">
{% trans "First published date:" %}
</label>
<input type="date" name="first_published_date" class="input" id="id_first_published_date"{% if form.first_published_date.value %} value="{{ form.first_published_date.value|date:'Y-m-d' }}"{% endif %} aria-describedby="desc_first_published_date">
{% include 'snippets/form_errors.html' with errors_list=form.first_published_date.errors id="desc_first_published_date" %}
</div>
<div class="field">
<label class="label" for="id_published_date">{% trans "Published date:" %}</label>
<input type="date" name="published_date" class="input" id="id_published_date"{% if form.published_date.value %} value="{{ form.published_date.value|date:'Y-m-d'}}"{% endif %}>
{% for error in form.published_date.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
<label class="label" for="id_published_date">
{% trans "Published date:" %}
</label>
<input type="date" name="published_date" class="input" id="id_published_date"{% if form.published_date.value %} value="{{ form.published_date.value|date:'Y-m-d'}}"{% endif %} aria-describedby="desc_published_date">
{% include 'snippets/form_errors.html' with errors_list=form.published_date.errors id="desc_published_date" %}
</div>
</div>
</section>
<section class="block">
<h2 class="title is-4">{% trans "Authors" %}</h2>
<h2 class="title is-4">
{% trans "Authors" %}
</h2>
<div class="box">
{% if book.authors.exists %}
<fieldset>
{% for author in book.authors.all %}
<div class="is-flex is-justify-content-space-between">
<label class="label mb-2">
<input type="checkbox" name="remove_authors" value="{{ author.id }}" {% if author.id|stringformat:"i" in remove_authors %}checked{% endif %}>
<input type="checkbox" name="remove_authors" value="{{ author.id }}" {% if author.id|stringformat:"i" in remove_authors %}checked{% endif %} aria-describedby="desc_remove_author_{{author.id}}">
{% blocktrans with name=author.name %}Remove {{ name }}{% endblocktrans %}
</label>
<p class="help">
<p class="help" id="desc_remove_author_{{author.id}}">
<a href="{{ author.local_path }}">{% blocktrans with name=author.name %}Author page for {{ name }}{% endblocktrans %}</a>
</p>
</div>
@ -119,17 +138,27 @@
</fieldset>
{% endif %}
<div class="field">
<label class="label" for="id_add_author">{% trans "Add Authors:" %}</label>
<input class="input" type="text" name="add_author" id="id_add_author" placeholder="{% trans 'John Doe, Jane Smith' %}" value="{{ add_author }}" {% if confirm_mode %}readonly{% endif %}>
<span class="help">{% trans "Separate multiple values with commas." %}</span>
<label class="label" for="id_add_author">
{% trans "Add Authors:" %}
</label>
{% for author in add_author %}
<label class="label is-sr-only" for="id_add_author{% if not forloop.first %}-{{forloop.counter}}{% endif %}">{% trans "Add Author" %}</label>
<input class="input" type="text" name="add_author" id="id_add_author{% if not forloop.first %}-{{forloop.counter}}{% endif %}" placeholder="{% trans 'Jane Doe' %}" value="{{ author }}" {% if confirm_mode %}readonly{% endif %}>
{% empty %}
<label class="label is-sr-only" for="id_add_author">{% trans "Add Author" %}</label>
<input class="input" type="text" name="add_author" id="id_add_author" placeholder="{% trans 'Jane Doe' %}" value="{{ author }}" {% if confirm_mode %}readonly{% endif %}>
{% endfor %}
</div>
<span class="help"><button class="button is-small" type="button" data-duplicate="id_add_author" id="another_author_field">{% trans "Add Another Author" %}</button></span>
</div>
</section>
</div>
<div class="column is-half">
<section class="block">
<h2 class="title is-4">{% trans "Cover" %}</h2>
<h2 class="title is-4">
{% trans "Cover" %}
</h2>
<div class="box">
<div class="columns">
{% if book.cover %}
@ -140,108 +169,122 @@
<div class="column">
<div class="field">
<label class="label" for="id_cover">{% trans "Upload cover:" %}</label>
<label class="label" for="id_cover">
{% trans "Upload cover:" %}
</label>
{{ form.cover }}
</div>
<div class="field">
<label class="label" for="id_cover_url">
{% trans "Load cover from url:" %}
</label>
<input class="input" name="cover-url" id="id_cover_url" type="url" value="{{ cover_url|default:'' }}">
<input class="input" name="cover-url" id="id_cover_url" type="url" value="{{ cover_url|default:'' }}" aria-describedby="desc_cover">
</div>
{% for error in form.cover.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.cover.errors id="desc_cover" %}
</div>
</div>
</div>
</section>
<section class="block">
<h2 class="title is-4">{% trans "Physical Properties" %}</h2>
<h2 class="title is-4">
{% trans "Physical Properties" %}
</h2>
<div class="box">
<div class="columns">
<div class="column is-one-third">
<div class="field">
<label class="label" for="id_physical_format">{% trans "Format:" %}</label>
<label class="label" for="id_physical_format">
{% trans "Format:" %}
</label>
<div class="select">
{{ form.physical_format }}
</div>
{% for error in form.physical_format.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.physical_format.errors id="desc_physical_format" %}
</div>
</div>
<div class="column">
<div class="field">
<label class="label" for="id_physical_format_detail">{% trans "Format details:" %}</label>
<label class="label" for="id_physical_format_detail">
{% trans "Format details:" %}
</label>
{{ form.physical_format_detail }}
{% for error in form.physical_format_detail.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.physical_format_detail.errors id="desc_physical_format_detail" %}
</div>
</div>
</div>
<div class="field">
<label class="label" for="id_pages">{% trans "Pages:" %}</label>
<label class="label" for="id_pages">
{% trans "Pages:" %}
</label>
{{ form.pages }}
{% for error in form.pages.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.pages.errors id="desc_pages" %}
</div>
</div>
</section>
<section class="block">
<h2 class="title is-4">{% trans "Book Identifiers" %}</h2>
<h2 class="title is-4">
{% trans "Book Identifiers" %}
</h2>
<div class="box">
<div class="field">
<label class="label" for="id_isbn_13">{% trans "ISBN 13:" %}</label>
<label class="label" for="id_isbn_13">
{% trans "ISBN 13:" %}
</label>
{{ form.isbn_13 }}
{% for error in form.isbn_13.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.isbn_13.errors id="desc_isbn_13" %}
</div>
<div class="field">
<label class="label" for="id_isbn_10">{% trans "ISBN 10:" %}</label>
<label class="label" for="id_isbn_10">
{% trans "ISBN 10:" %}
</label>
{{ form.isbn_10 }}
{% for error in form.isbn_10.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.isbn_10.errors id="desc_isbn_10" %}
</div>
<div class="field">
<label class="label" for="id_openlibrary_key">{% trans "Openlibrary ID:" %}</label>
<label class="label" for="id_openlibrary_key">
{% trans "Openlibrary ID:" %}
</label>
{{ form.openlibrary_key }}
{% for error in form.openlibrary_key.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.openlibrary_key.errors id="desc_openlibrary_key" %}
</div>
<div class="field">
<label class="label" for="id_inventaire_id">{% trans "Inventaire ID:" %}</label>
<label class="label" for="id_inventaire_id">
{% trans "Inventaire ID:" %}
</label>
{{ form.inventaire_id }}
{% for error in form.inventaire_id.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.inventaire_id.errors id="desc_inventaire_id" %}
</div>
<div class="field">
<label class="label" for="id_oclc_number">{% trans "OCLC Number:" %}</label>
<label class="label" for="id_oclc_number">
{% trans "OCLC Number:" %}
</label>
{{ form.oclc_number }}
{% for error in form.oclc_number.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.oclc_number.errors id="desc_oclc_number" %}
</div>
<div class="field">
<label class="label" for="id_asin">{% trans "ASIN:" %}</label>
<label class="label" for="id_asin">
{% trans "ASIN:" %}
</label>
{{ form.asin }}
{% for error in form.ASIN.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.ASIN.errors id="desc_ASIN" %}
</div>
</div>
</section>

View file

@ -18,7 +18,7 @@
</p>
<form name="directory" method="POST" action="{% url 'directory' %}">
{% csrf_token %}
<button class="button is-primary" type="submit">Join Directory</button>
<button class="button is-primary" type="submit">{% trans "Join Directory" %}</button>
<p class="help">
{% url 'prefs-profile' as path %}
{% blocktrans with path=path %}You can opt-out at any time in your <a href="{{ path }}">profile settings.</a>{% endblocktrans %}
@ -28,7 +28,7 @@
<div class="column is-narrow">
{% trans "Dismiss message" as button_text %}
<button type="button" class="delete set-display" data-id="hide_join_directory" data-value="true">
<span>Dismiss message</span>
<span>{% trans "Dismiss message" %}</span>
</button>
</div>
</div></div>

View file

@ -6,20 +6,62 @@
<h1 class="title">
{{ tab.name }}
</h1>
<div class="tabs">
<ul>
{% for stream in streams %}
<li class="{% if tab.key == stream.key %}is-active{% endif %}"{% if tab.key == stream.key %} aria-current="page"{% endif %}>
<a href="/{{ stream.key }}#feed">{{ stream.shortname }}</a>
</li>
{% endfor %}
</ul>
<div class="block is-clipped">
<div class="is-pulled-left">
<div class="tabs">
<ul>
{% for stream in streams %}
<li class="{% if tab.key == stream.key %}is-active{% endif %}"{% if tab.key == stream.key %} aria-current="page"{% endif %}>
<a href="/{{ stream.key }}#feed">{{ stream.shortname }}</a>
</li>
{% endfor %}
</ul>
</div>
</div>
{# feed settings #}
<details class="detail-pinned-button" {% if settings_saved %}open{% endif %}>
<summary class="control">
<span class="button">
<span class="icon icon-dots-three m-0-mobile" aria-hidden="true"></span>
<span class="is-sr-only-mobile">{{ _("Feed settings") }}</span>
</span>
</summary>
<form class="notification level is-align-items-flex-end" method="post" action="/{{ tab.key }}#feed">
{% csrf_token %}
<div class="level-left">
<div class="field">
<div class="control">
<span class="is-flex is-align-items-baseline">
<label class="label mt-2 mb-1">Status types</label>
{% if settings_saved %}
<span class="tag is-success is-light ml-2">{{ _("Saved!") }}</span>
{% endif %}
</span>
{% for name, value in feed_status_types_options %}
<label class="mr-2">
<input type="checkbox" name="feed_status_types" value="{{ name }}" {% if name in user.feed_status_types %}checked=""{% endif %}/>
{{ value }}
</label>
{% endfor %}
</div>
</div>
</div>
<div class="level-right control">
<button class="button is-small is-primary is-outlined" type="submit">
{{ _("Save settings") }}
</button>
</div>
</form>
</details>
</div>
{# announcements and system messages #}
{% if not activities.number > 1 %}
<a href="{{ request.path }}" class="transition-y is-hidden notification is-primary is-block" data-poll-wrapper>
{% blocktrans with tab_key=tab.key %}load <span data-poll="stream/{{ tab_key }}">0</span> unread status(es){% endblocktrans %}
{{ allowed_status_types|json_script:"unread-notifications-wrapper" }}
</a>
{% if request.user.show_goal and not goal and tab.key == 'home' %}
@ -36,6 +78,7 @@
{% if not activities %}
<div class="block content">
<p>{% trans "There aren't any activities right now! Try following a user to get started" %}</p>
<p>{% if user.feed_status_types|length < 4 %}{% trans "Alternatively, you can try enabling more status types" %}{% endif %}</p>
{% if request.user.show_suggested_users and suggested_users %}
{# suggested users for when things are very lonely #}

View file

@ -2,6 +2,18 @@
{% load i18n %}
{% load bookwyrm_tags %}
{% block opengraph_images %}
{% firstof status.book status.mention_books.first as book %}
{% if book %}
{% include 'snippets/opengraph_images.html' with image=preview %}
{% else %}
{% include 'snippets/opengraph_images.html' %}
{% endif %}
{% endblock %}
{% block panel %}
<header class="block">
<a href="/#feed" class="button" data-back>

View file

@ -4,9 +4,14 @@
<div class="select is-small mt-1 mb-3">
<select name="{{ book.id }}" aria-label="{% blocktrans with book_title=book.title %}Have you read {{ book_title }}?{% endblocktrans %}">
<option disabled selected value>Add to your books</option>
<option disabled selected value>{% trans 'Add to your books' %}</option>
{% for shelf in user_shelves %}
<option value="{{ shelf.id }}">{{ shelf.name }}</option>
<option value="{{ shelf.id }}">
{% if shelf.identifier == 'to-read' %}{% trans "To Read" %}
{% elif shelf.identifier == 'reading' %}{% trans "Currently Reading" %}
{% elif shelf.identifier == 'read' %}{% trans "Read" %}
{% else %}{{ shelf.name }}{% endif %}
</option>
{% endfor %}
</select>
</div>

View file

@ -14,16 +14,14 @@
<div class="block">
<label class="label" for="id_name">{% trans "Display name:" %}</label>
<input type="text" name="name" maxlength="100" class="input" id="id_name" placeholder="{{ user.localname }}" value="{% if request.user.name %}{{ request.user.name }}{% endif %}">
{% for error in form.name.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.name.errors id="desc_name" %}
</div>
<div class="block">
<label class="label" for="id_summary">{% trans "Summary:" %}</label>
<textarea name="summary" cols="None" rows="None" class="textarea" id="id_summary" placeholder="{% trans 'A little bit about you' %}">{% if request.user.summary %}{{ request.user.summary }}{% endif %}</textarea>
{% for error in form.summary.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.summary.errors id="desc_summary" %}
</div>
</div>
@ -31,9 +29,8 @@
<div class="block">
<label class="label" for="id_avatar">{% trans "Avatar:" %}</label>
{{ form.avatar }}
{% for error in form.avatar.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.avatar.errors id="desc_avatar" %}
</div>
</div>
</div>

View file

@ -65,10 +65,9 @@
{% csrf_token %}
<div class="block">
<label for="id_request_email" class="label">{% trans "Email address:" %}</label>
<input type="email" name="email" maxlength="255" class="input" required="" id="id_request_email">
{% for error in request_form.email.errors %}
<p class="help is-danger">{{ error|escape }}</p>
{% endfor %}
<input type="email" name="email" maxlength="255" class="input" required="" id="id_request_email" aria-describedby="desc_request_email">
{% include 'snippets/form_errors.html' with errors_list=request_form.email.errors id="desc_request_email" %}
</div>
<button type="submit" class="button is-link">{% trans "Submit" %}</button>
</form>

View file

@ -26,11 +26,10 @@
<div class="field">
<label class="label" for="id_password_confirm">{% trans "Password:" %}</label>
<div class="control">
<input type="password" name="password" maxlength="128" class="input" required="" id="id_password_confirm">
<input type="password" name="password" maxlength="128" class="input" required="" id="id_password_confirm" aria-describedby="desc_password">
</div>
{% for error in login_form.password.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=login_form.password.errors id="desc_password" %}
</div>
<div class="field is-grouped">
<div class="control">

View file

@ -8,21 +8,33 @@
<div class="column">
<div class="block">
<h1 class="title">{% trans "Reset Password" %}</h1>
{% for error in errors %}
<p class="is-danger">{{ error }}</p>
{% endfor %}
{% if errors %}
<div id="form_errors">
{% for error in errors %}
<p class="is-danger">
{{ error }}
</p>
{% endfor %}
</div>
{% endif %}
<form name="password-reset" method="post" action="/password-reset/{{ code }}">
{% csrf_token %}
<div class="field">
<label class="label" for="id_new_password">{% trans "Password:" %}</label>
<label class="label" for="id_new_password">
{% trans "Password:" %}
</label>
<div class="control">
<input type="password" name="password" maxlength="128" class="input" required="" id="id_new_password">
<input type="password" name="password" maxlength="128" class="input" required="" id="id_new_password" aria-describedby="form_errors">
</div>
</div>
<div class="field">
<label class="label" for="id_confirm_password">{% trans "Confirm password:" %}</label>
<label class="label" for="id_confirm_password">
{% trans "Confirm password:" %}
</label>
<div class="control">
<input type="password" name="confirm-password" maxlength="128" class="input" required="" id="id_confirm_password">
<input type="password" name="confirm-password" maxlength="128" class="input" required="" id="id_confirm_password" aria-describedby="form_errors">
</div>
</div>
<div class="field is-grouped">

View file

@ -32,11 +32,11 @@
<body>
<nav class="navbar" aria-label="main navigation">
<div class="container">
<div class="navbar-brand">
<div class="navbar-brand is-align-items-end">
<a class="navbar-item" href="/">
<img class="image logo" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}" alt="Home page">
</a>
<form class="navbar-item column" action="{% url 'search' %}">
<form class="navbar-item mt-1" action="{% url 'search' %}">
<div class="field has-addons">
<div class="control">
{% if user.is_authenticated %}
@ -159,7 +159,7 @@
</a>
</div>
{% else %}
<div class="navbar-item">
<div class="navbar-item mt-1">
{% if request.path != '/login' and request.path != '/login/' %}
<div class="columns">
<div class="column">

View file

@ -7,8 +7,8 @@
<div class="column is-one-quarter">
<div class="card is-stretchable">
<header class="card-header">
<h4 class="card-header-title">
<a href="{{ list.local_path }}">{{ list.name }}</a> <span class="subtitle">{% include 'snippets/privacy-icons.html' with item=list %}</span>
<h4 class="card-header-title is-clipped">
<a href="{{ list.local_path }}" class="is-clipped">{{ list.name }}</a> <span class="subtitle">{% include 'snippets/privacy-icons.html' with item=list %}</span>
</h4>
{% if request.user.is_authenticated and request.user|saved:list %}
<div class="card-header-icon">

View file

@ -18,10 +18,9 @@
{% csrf_token %}
<div class="field">
<label class="label" for="id_password">{% trans "Confirm password:" %}</label>
<input class="input {% if form.password.errors %}is-danger{% endif %}" type="password" name="password" id="id_password" required>
{% for error in form.password.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
<input class="input {% if form.password.errors %}is-danger{% endif %}" type="password" name="password" id="id_password" required aria-describedby="desc_password">
{% include 'snippets/form_errors.html' with errors_list=form.password.errors id="desc_password" %}
</div>
<button type="submit" class="button is-danger">{% trans "Delete Account" %}</button>
</form>

View file

@ -33,31 +33,27 @@
{% endif %}
<div class="column">
{{ form.avatar }}
{% for error in form.avatar.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.avatar.errors id="desc_avatar" %}
</div>
</div>
<div class="field">
<label class="label" for="id_name">{% trans "Display name:" %}</label>
{{ form.name }}
{% for error in form.name.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.name.errors id="desc_name" %}
</div>
<div class="field">
<label class="label" for="id_summary">{% trans "Summary:" %}</label>
{{ form.summary }}
{% for error in form.summary.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.summary.errors id="desc_summary" %}
</div>
<div class="field">
<label class="label" for="id_email">{% trans "Email address:" %}</label>
{{ form.email }}
{% for error in form.email.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.email.errors id="desc_email" %}
</div>
</div>
</section>
@ -69,19 +65,23 @@
<div class="box">
<div class="field">
<label class="checkbox label" for="id_show_goal">
{% trans "Show reading goal prompt in feed:" %}
{{ form.show_goal }}
{% trans "Show reading goal prompt in feed" %}
</label>
</div>
<div class="field">
<label class="checkbox label" for="id_show_suggested_users">
{% trans "Show suggested users:" %}
{{ form.show_suggested_users }}
{% trans "Show suggested users" %}
</label>
</div>
<div class="field">
<label class="checkbox label" for="id_discoverable">
{% trans "Show this account in suggested users:" %}
{{ form.discoverable }}
{% trans "Show this account in suggested users" %}
</label>
{% url 'directory' as path %}
<p class="help">
<p class="help" id="desc_discoverable">
{% blocktrans %}Your account will show up in the <a href="{{ path }}">directory</a>, and may be recommended to other BookWyrm users.{% endblocktrans %}
</p>
</div>
@ -107,8 +107,8 @@
<div class="box">
<div class="field">
<label class="checkbox label" for="id_manually_approves_followers">
{% trans "Manually approve followers:" %}
{{ form.manually_approves_followers }}
{% trans "Manually approve followers" %}
</label>
</div>
<div class="field">

View file

@ -39,7 +39,7 @@
<header class="columns is-mobile">
<div class="column">
<h3 class="title is-5">
Results from
{% trans 'Results from' %}
<a href="{{ result_set.connector.base_url }}" target="_blank">{{ result_set.connector.name|default:result_set.connector.identifier }}</a>
</h3>
</div>

View file

@ -13,60 +13,68 @@
{% csrf_token %}
<input type="hidden" name="user" value="{{ request.user.id }}">
<p>
<label class="label" for="id_preview">{% trans "Preview:" %}</label>
<label class="label" for="id_preview">
{% trans "Preview:" %}
</label>
{{ form.preview }}
{% for error in form.preview.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.preview.errors id="desc_preview" %}
</p>
<p>
<label class="label" for="id_content">{% trans "Content:" %}</label>
<label class="label" for="id_content">
{% trans "Content:" %}
</label>
{{ form.content }}
{% for error in form.content.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.content.errors id="desc_content" %}
</p>
<p>
<label class="label" for="id_event_date">{% trans "Event date:" %}</label>
<label class="label" for="id_event_date">
{% trans "Event date:" %}
</label>
<input type="date" name="event_date" value="{{ form.event_date.value|date:'Y-m-d' }}" class="input" id="id_event_date">
{% for error in form.event_date.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.event_date.errors id="desc_event_date" %}
</p>
<hr aria-hidden="true">
<div class="columns">
<div class="column">
<p>
<label class="label" for="id_start_date">{% trans "Start date:" %}</label>
<label class="label" for="id_start_date">
{% trans "Start date:" %}
</label>
<input type="date" name="start_date" class="input" value="{{ form.start_date.value|date:'Y-m-d' }}" id="id_start_date">
{% for error in form.start_date.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.start_date.errors id="desc_start_date" %}
</p>
</div>
<div class="column">
<p>
<label class="label" for="id_end_date">{% trans "End date:" %}</label>
<label class="label" for="id_end_date">
{% trans "End date:" %}
</label>
<input type="date" name="end_date" class="input" id="id_end_date" value="{{ form.end_date.value|date:'Y-m-d' }}">
{% for error in form.end_date.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.end_date.errors id="desc_end_date" %}
</p>
</div>
<div class="column is-narrow">
<p>
<label class="label" for="id_active">{% trans "Active:" %}</label>
<label class="label" for="id_active">
{% trans "Active:" %}
</label>
{{ form.active }}
{% for error in form.active.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.active.errors id="desc_active" %}
</p>
</div>
</div>
<div class="field has-addons">
<div class="control">
<button type="submit" class="button is-primary">{% trans "Save" %}</button>
<button type="submit" class="button is-primary">
{% trans "Save" %}
</button>
</div>
</div>
{% endblock %}

View file

@ -17,10 +17,8 @@
{{ form.domain }}
</div>
</div>
{% for error in form.domain.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.domain.errors id="desc_domain" %}
<div class="field">
<div class="control">
<button type="submit" class="button is-primary">{% trans "Add" %}</button>

View file

@ -27,11 +27,12 @@
<div class="columns">
<div class="column is-half">
<div class="field">
<label class="label" for="id_server_name">{% trans "Instance:" %}</label>
<input type="text" name="server_name" maxlength="255" class="input" required id="id_server_name" value="{{ form.server_name.value|default:'' }}" placeholder="domain.com">
{% for error in form.server_name.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
<label class="label" for="id_server_name">
{% trans "Instance:" %}
</label>
<input type="text" name="server_name" maxlength="255" class="input" required id="id_server_name" value="{{ form.server_name.value|default:'' }}" placeholder="domain.com" aria-describedby="desc_server_name">
{% include 'snippets/form_errors.html' with errors_list=form.server_name.errors id="desc_server_name" %}
</div>
</div>
<div class="column is-half">
@ -49,29 +50,37 @@
<div class="columns">
<div class="column is-half">
<div class="field">
<label class="label" for="id_application_type">{% trans "Software:" %}</label>
<input type="text" name="application_type" maxlength="255" class="input" id="id_application_type" value="{{ form.application_type.value|default:'' }}">
{% for error in form.application_type.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
<label class="label" for="id_application_type">
{% trans "Software:" %}
</label>
<input type="text" name="application_type" maxlength="255" class="input" id="id_application_type" value="{{ form.application_type.value|default:'' }}" aria-describedby="desc_application_type">
{% include 'snippets/form_errors.html' with errors_list=form.application_type.errors id="desc_application_type" %}
</div>
</div>
<div class="column is-half">
<div class="field">
<label class="label" for="id_application_version">{% trans "Version:" %}</label>
<input type="text" name="application_version" maxlength="255" class="input" id="id_application_version" value="{{ form.application_version.value|default:'' }}">
{% for error in form.application_version.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
<label class="label" for="id_application_version">
{% trans "Version:" %}
</label>
<input type="text" name="application_version" maxlength="255" class="input" id="id_application_version" value="{{ form.application_version.value|default:'' }}" aria-describedby="desc_application_version">
{% include 'snippets/form_errors.html' with errors_list=form.application_version.errors id="desc_application_version" %}
</div>
</div>
</div>
<div class="field">
<label class="label" for="id_notes">{% trans "Notes:" %}</label>
<textarea name="notes" cols="40" rows="5" class="textarea" id="id_notes">{{ form.notes.value|default:'' }}</textarea>
<label class="label" for="id_notes">
{% trans "Notes:" %}
</label>
<textarea name="notes" cols="40" rows="5" class="textarea" id="id_notes">
{{ form.notes.value|default:'' }}
</textarea>
</div>
<button type="submit" class="button is-primary">{% trans "Save" %}</button>
<button type="submit" class="button is-primary">
{% trans "Save" %}
</button>
</form>
{% endblock %}

View file

@ -20,16 +20,16 @@
</div>
<div class="field">
<input type="text" name="address" maxlength="255" class="input" required="" id="id_address" placeholder="190.0.2.0/24">
<input type="text" name="address" maxlength="255" class="input" required="" id="id_address" placeholder="190.0.2.0/24" aria-describedby="desc_address">
</div>
{% for error in form.address.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=form.address.errors id="desc_address" %}
<div class="field">
<div class="control">
<button type="submit" class="button is-primary">{% trans "Add" %}</button>
<button type="submit" class="button is-primary">
{% trans "Add" %}
</button>
</div>
</div>
</form>

View file

@ -33,8 +33,8 @@
{{ site_form.instance_description }}
</div>
<div class="field">
<label class="label mb-0" for="id_short_description">{% trans "Short description:" %}</label>
<p class="help">{% trans "Used when the instance is previewed on joinbookwyrm.com. Does not support HTML or Markdown." %}</p>
<label class="label mb-0" for="id_instance_short_description">{% trans "Short description:" %}</label>
<p class="help" id="desc_instance_short_description">{% trans "Used when the instance is previewed on joinbookwyrm.com. Does not support HTML or Markdown." %}</p>
{{ site_form.instance_short_description }}
</div>
<div class="field">
@ -114,7 +114,7 @@
{{ site_form.require_confirm_email }}
{% trans "Require users to confirm email address" %}
</label>
<p class="help">{% trans "(Recommended if registration is open)" %}</p>
<p class="help" id="desc_require_confirm_email">{% trans "(Recommended if registration is open)" %}</p>
</div>
<div class="field">
<label class="label" for="id_registration_closed_text">{% trans "Registration closed text:" %}</label>
@ -123,9 +123,8 @@
<div class="field">
<label class="label" for="id_invite_request_text">{% trans "Invite request text:" %}</label>
{{ site_form.invite_request_text }}
{% for error in site_form.invite_request_text.errors %}
<p class="help is-danger">{{ error|escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=site_form.invite_request_text.errors id="desc_invite_request_text" %}
</div>
</div>
</section>

View file

@ -15,10 +15,9 @@
</p>
<div class="field">
<label class="label" for="id_password">{% trans "Your password:" %}</label>
<input class="input {% if form.password.errors %}is-danger{% endif %}" type="password" name="password" id="id_password" required>
{% for error in form.password.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
<input class="input {% if form.password.errors %}is-danger{% endif %}" type="password" name="password" id="id_password" required aria-describedby="desc_password">
{% include 'snippets/form_errors.html' with errors_list=form.password.errors id="desc_password" %}
</div>
<button type="submit" class="button is-danger">{% trans "Delete Account" %}</button>
</form>

View file

@ -50,18 +50,23 @@
{% endif %}
{% with group=user.groups.first %}
<div class="select">
<select name="groups" id="id_user_group">
<select name="groups" id="id_user_group" aria-describedby="desc_user_group">
{% for value, name in group_form.fields.groups.choices %}
<option value="{{ value }}" {% if name == group.name %}selected{% endif %}>{{ name|title }}</option>
<option value="{{ value }}" {% if name == group.name %}selected{% endif %}>
{{ name|title }}
</option>
{% endfor %}
<option value="" {% if not group %}selected{% endif %}>User</option>
<option value="" {% if not group %}selected{% endif %}>
User
</option>
</select>
</div>
{% for error in group_form.groups.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
{% include 'snippets/form_errors.html' with errors_list=group_form.groups.errors id="desc_user_group" %}
{% endwith %}
<button class="button">{% trans "Save" %}</button>
<button class="button">
{% trans "Save" %}
</button>
</form>
</div>
{% endif %}

View file

@ -80,7 +80,10 @@
<div class="block columns is-mobile">
<div class="column">
<h2 class="title is-3">
{{ shelf.name }}
{% if shelf.identifier == 'to-read' %}{% trans "To Read" %}
{% elif shelf.identifier == 'reading' %}{% trans "Currently Reading" %}
{% elif shelf.identifier == 'read' %}{% trans "Read" %}
{% else %}{{ shelf.name }}{% endif %}
<span class="subtitle">
{% include 'snippets/privacy-icons.html' with item=shelf %}
</span>

View file

@ -0,0 +1,9 @@
{% if errors_list %}
<div id="{{ id }}">
{% for error in errors_list %}
<p class="help is-danger">
{{ error | escape }}
</p>
{% endfor %}
</div>
{% endif %}

View file

@ -9,10 +9,11 @@ Finish "<em>{{ book_title }}</em>"
{% endblock %}
{% block modal-form-open %}
<form name="finish-reading" action="{% url 'reading-status' 'finish' book.id %}" method="post" class="submit-status">
<form name="finish-reading" action="{% url 'reading-status' 'finish' book.id %}" method="post" {% if not refresh %}class="submit-status"{% endif %}>
{% csrf_token %}
<input type="hidden" name="id" value="{{ readthrough.id }}">
<input type="hidden" name="reading_status" value="read">
<input type="hidden" name="shelf" value="{{ move_from }}">
{% endblock %}
{% block reading-dates %}

View file

@ -9,8 +9,9 @@ Start "<em>{{ book_title }}</em>"
{% endblock %}
{% block modal-form-open %}
<form name="start-reading" action="{% url 'reading-status' 'start' book.id %}" method="post" class="submit-status">
<form name="start-reading" action="{% url 'reading-status' 'start' book.id %}" method="post" {% if not refresh %}class="submit-status"{% endif %}>
<input type="hidden" name="reading_status" value="reading">
<input type="hidden" name="shelf" value="{{ move_from }}">
{% csrf_token %}
{% endblock %}

View file

@ -9,8 +9,9 @@ Want to Read "<em>{{ book_title }}</em>"
{% endblock %}
{% block modal-form-open %}
<form name="shelve" action="{% url 'reading-status' 'want' book.id %}" method="post" class="submit-status">
<form name="shelve" action="{% url 'reading-status' 'want' book.id %}" method="post" {% if not refresh %}class="submit-status"{% endif %}>
<input type="hidden" name="reading_status" value="to-read">
<input type="hidden" name="shelf" value="{{ move_from }}">
{% csrf_token %}
{% endblock %}

View file

@ -3,32 +3,31 @@
<div class="field">
<label class="label" for="id_localname_register">{% trans "Username:" %}</label>
<div class="control">
<input type="text" name="localname" maxlength="150" class="input" required="" id="id_localname_register" value="{% if register_form.localname.value %}{{ register_form.localname.value }}{% endif %}">
<input type="text" name="localname" maxlength="150" class="input" required="" id="id_localname_register" value="{% if register_form.localname.value %}{{ register_form.localname.value }}{% endif %}" aria-describedby="desc_localname_register">
{% include 'snippets/form_errors.html' with errors_list=register_form.localname.errors id="desc_localname_register" %}
</div>
{% for error in register_form.localname.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
</div>
<div class="field">
<label class="label" for="id_email_register">{% trans "Email address:" %}</label>
<div class="control">
<input type="email" name="email" maxlength="254" class="input" id="id_email_register" value="{% if register_form.email.value %}{{ register_form.email.value }}{% endif %}" required>
{% for error in register_form.email.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
<input type="email" name="email" maxlength="254" class="input" id="id_email_register" value="{% if register_form.email.value %}{{ register_form.email.value }}{% endif %}" required aria-describedby="desc_email_register">
{% include 'snippets/form_errors.html' with errors_list=register_form.email.errors id="desc_email_register" %}
</div>
</div>
<div class="field">
<label class="label" for="id_password_register">{% trans "Password:" %}</label>
<div class="control">
<input type="password" name="password" maxlength="128" class="input" required="" id="id_password_register">
{% for error in register_form.password.errors %}
<p class="help is-danger">{{ error | escape }}</p>
{% endfor %}
<input type="password" name="password" maxlength="128" class="input" required="" id="id_password_register" aria-describedby="desc_password_register">
{% include 'snippets/form_errors.html' with errors_list=register_form.password.errors id="desc_password_register" %}
</div>
</div>
<div class="field is-grouped">
<div class="control">
<button class="button is-primary" type="submit">{% trans "Sign Up" %}</button>
<button class="button is-primary" type="submit">
{% trans "Sign Up" %}
</button>
</div>
</div>

View file

@ -1,29 +1,96 @@
{% extends 'components/dropdown.html' %}
{% load i18n %}
{% load bookwyrm_tags %}
{% load utilities %}
{% block dropdown-trigger %}
<span>{% trans "Move book" %}</span>
<span class="icon icon-arrow-down" aria-hidden="true"></span>
{% endblock %}
{% block dropdown-list %}
{% with book.id|uuid as uuid %}
{% active_shelf book as active_shelf %}
{% latest_read_through book request.user as readthrough %}
{% for shelf in user_shelves %}
{% if shelf.editable %}
<li role="menuitem" class="dropdown-item p-0">
<form name="shelve" action="/shelve/" method="post">
{% csrf_token %}
<input type="hidden" name="book" value="{{ book.id }}">
<input type="hidden" name="change-shelf-from" value="{{ current.identifier }}">
<input type="hidden" name="shelf" value="{{ shelf.identifier }}">
<button class="button is-fullwidth is-small shelf-option is-radiusless is-white" type="submit" {% if shelf.identifier == current.identifier %}disabled{% endif %}><span>{{ shelf.name }}</span></button>
<button class="button is-fullwidth is-small shelf-option is-radiusless is-white" type="submit" {% if shelf.identifier == current.identifier %}disabled{% endif %}>
<span>
{% if shelf.identifier == 'to-read' %}{% trans "To Read" %}
{% elif shelf.identifier == 'reading' %}{% trans "Currently Reading" %}
{% elif shelf.identifier == 'read' %}{% trans "Read" %}
{% else %}{{ shelf.name }}{% endif %}
</span>
</button>
</form>
</li>
{% else%}
{% comparison_bool shelf.identifier active_shelf.shelf.identifier as is_current %}
{% with button_class="is-fullwidth is-small shelf-option is-radiusless is-white" %}
<li role="menuitem" class="dropdown-item p-0">
{% if shelf.identifier == 'reading' %}
{% trans "Start reading" as button_text %}
{% url 'reading-status' 'start' book.id as fallback_url %}
{% include 'snippets/toggle/toggle_button.html' with class=button_class text=button_text controls_text="start_reading" controls_uid=uuid focus="modal_title_start_reading" disabled=is_current fallback_url=fallback_url %}
{% elif shelf.identifier == 'read' %}
{% trans "Read" as button_text %}
{% url 'reading-status' 'finish' book.id as fallback_url %}
{% include 'snippets/toggle/toggle_button.html' with class=button_class text=button_text controls_text="finish_reading" controls_uid=uuid focus="modal_title_finish_reading" disabled=is_current fallback_url=fallback_url %}
{% elif shelf.identifier == 'to-read' %}
{% trans "Want to read" as button_text %}
{% url 'reading-status' 'want' book.id as fallback_url %}
{% include 'snippets/toggle/toggle_button.html' with class=button_class text=button_text controls_text="want_to_read" controls_uid=uuid focus="modal_title_want_to_read" disabled=is_current fallback_url=fallback_url %}
{% endif %}
</li>
{% endwith %}
{% endif %}
{% endfor %}
<li class="navbar-divider" role="separator"></li>
{% if shelf.identifier == 'all' %}
{% for shelved_in in book.shelves.all %}
<li class="navbar-divider m-0" role="separator" ></li>
<li role="menuitem" class="dropdown-item p-0">
<form name="shelve" action="/unshelve/" method="post">
{% csrf_token %}
<input type="hidden" name="book" value="{{ book.id }}">
<input type="hidden" name="shelf" value="{{ current.id }}">
<button class="button is-fullwidth is-small is-radiusless is-danger is-light" type="submit">{% trans "Remove" %}</button>
<input type="hidden" name="shelf" value="{{ shelved_in.id }}">
<button class="button is-fullwidth is-small is-radiusless is-danger is-light" type="submit">{% trans "Remove from" %} {{ shelved_in.name }}</button>
</form>
</li>
{% endfor %}
{% else %}
<li class="navbar-divider" role="separator" ></li>
<li role="menuitem" class="dropdown-item p-0">
<form name="shelve" action="/unshelve/" method="post">
{% csrf_token %}
<input type="hidden" name="book" value="{{ book.id }}">
<input type="hidden" name="shelf" value="{{ shelf.id }}">
<button class="button is-fullwidth is-small is-radiusless is-danger is-light" type="submit">{% trans "Remove from" %} {{ shelf.name }}</button>
</form>
</li>
{% endif %}
{% include 'snippets/reading_modals/want_to_read_modal.html' with book=active_shelf.book controls_text="want_to_read" controls_uid=uuid move_from=current.id refresh=True class="" %}
{% include 'snippets/reading_modals/start_reading_modal.html' with book=active_shelf.book controls_text="start_reading" controls_uid=uuid move_from=current.id refresh=True class="" %}
{% include 'snippets/reading_modals/finish_reading_modal.html' with book=active_shelf.book controls_text="finish_reading" controls_uid=uuid move_from=current.id readthrough=readthrough refresh=True class="" %}
{% endwith %}
{% endblock %}

View file

@ -32,7 +32,7 @@
{% elif shelf.editable %}
<form name="shelve" action="/shelve/" method="post">
<form name="shelve" action="/shelve/" method="post" autocomplete="off">
{% csrf_token %}
<input type="hidden" name="book" value="{{ active_shelf.book.id }}">
<button class="button {{ class }}" name="shelf" type="submit" value="{{ shelf.identifier }}" {% if shelf in book.shelf_set.all %} disabled {% endif %}>

View file

@ -1,6 +1,6 @@
{% load utilities %}
{% if fallback_url %}
<form name="fallback_form_{{ 0|uuid }}" method="GET" action="{{ fallback_url }}">
<form name="fallback_form_{{ 0|uuid }}" method="GET" action="{{ fallback_url }}" autocomplete="off">
{% endif %}
<button
{% if not fallback_url %}

View file

@ -29,8 +29,13 @@
<div class="columns is-mobile scroll-x">
{% for shelf in shelves %}
<div class="column is-narrow">
<h3>{{ shelf.name }}
{% if shelf.size > 3 %}<small>(<a href="{{ shelf.local_path }}">{% blocktrans with size=shelf.size %}View all {{ size }}{% endblocktrans %}</a>)</small>{% endif %}</h3>
<h3>
{% if shelf.name == 'To Read' %}{% trans "To Read" %}
{% elif shelf.name == 'Currently Reading' %}{% trans "Currently Reading" %}
{% elif shelf.name == 'Read' %}{% trans "Read" %}
{% else %}{{ shelf.name }}{% endif %}
{% if shelf.size > 3 %}<small>(<a href="{{ shelf.local_path }}">{% blocktrans with size=shelf.size %}View all {{ size }}{% endblocktrans %}</a>)</small>{% endif %}
</h3>
<div class="is-mobile field is-grouped">
{% for book in shelf.books %}
<div class="control">
@ -49,7 +54,8 @@
{% if goal %}
<div class="block">
<h2 class="title">{% now 'Y' %} Reading Goal</h2>
{% now 'Y' as current_year%}
<h2 class="title">{% blocktrans %}{{ current_year }} Reading Goal{% endblocktrans %}</h2>
{% include 'snippets/goal_progress.html' with goal=goal %}
</div>
{% endif %}

View file

@ -77,7 +77,12 @@ def related_status(notification):
def active_shelf(context, book):
"""check what shelf a user has a book on, if any"""
if hasattr(book, "current_shelves"):
return book.current_shelves[0] if len(book.current_shelves) else {"book": book}
read_shelves = [
s
for s in book.current_shelves
if s.shelf.identifier in models.Shelf.READ_STATUS_IDENTIFIERS
]
return read_shelves[0] if len(read_shelves) else {"book": book}
shelf = (
models.ShelfBook.objects.filter(

View file

@ -50,10 +50,17 @@ class UpdateViews(TestCase):
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.activitystreams.ActivityStream.get_unread_count") as mock:
mock.return_value = 3
result = views.get_unread_status_count(request, "home")
with patch(
"bookwyrm.activitystreams.ActivityStream.get_unread_count"
) as mock_count:
with patch(
"bookwyrm.activitystreams.ActivityStream.get_unread_count_by_status_type"
) as mock_count_by_status:
mock_count.return_value = 3
mock_count_by_status.return_value = {"review": 5}
result = views.get_unread_status_count(request, "home")
self.assertIsInstance(result, JsonResponse)
data = json.loads(result.getvalue())
self.assertEqual(data["count"], 3)
self.assertEqual(data["count_by_type"]["review"], 5)

View file

@ -19,7 +19,7 @@ def request_isni_data(search_index, search_term, max_records=5):
"recordPacking": "xml",
"sortKeys": "RLV,pica,0,,",
}
result = requests.get("http://isni.oclc.org/sru/", params=query_params, timeout=10)
result = requests.get("http://isni.oclc.org/sru/", params=query_params, timeout=15)
# the OCLC ISNI server asserts the payload is encoded
# in latin1, but we know better
result.encoding = "utf-8"

View file

@ -51,13 +51,14 @@ class EditBook(View):
if not form.is_valid():
return TemplateResponse(request, "book/edit/edit_book.html", data)
add_author = request.POST.get("add_author")
# we're adding an author through a free text field
# filter out empty author fields
add_author = [author for author in request.POST.getlist("add_author") if author]
if add_author:
data["add_author"] = add_author
data["author_matches"] = []
data["isni_matches"] = []
for author in add_author.split(","):
for author in add_author:
if not author:
continue
# check for existing authors

View file

@ -10,10 +10,11 @@ from django.utils.decorators import method_decorator
from django.views import View
from bookwyrm import activitystreams, forms, models
from bookwyrm.models.user import FeedFilterChoices
from bookwyrm.activitypub import ActivitypubResponse
from bookwyrm.settings import PAGE_LENGTH, STREAMS
from bookwyrm.suggested_users import suggested_users
from .helpers import get_user_from_username
from .helpers import filter_stream_by_status_type, get_user_from_username
from .helpers import is_api_request, is_bookwyrm_request
@ -22,7 +23,17 @@ from .helpers import is_api_request, is_bookwyrm_request
class Feed(View):
"""activity stream"""
def get(self, request, tab):
def post(self, request, tab):
"""save feed settings form, with a silent validation fail"""
settings_saved = False
form = forms.FeedStatusTypesForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
settings_saved = True
return self.get(request, tab, settings_saved)
def get(self, request, tab, settings_saved=False):
"""user's homepage with activity feed"""
tab = [s for s in STREAMS if s["key"] == tab]
tab = tab[0] if tab else STREAMS[0]
@ -30,7 +41,11 @@ class Feed(View):
activities = activitystreams.streams[tab["key"]].get_activity_stream(
request.user
)
paginated = Paginator(activities, PAGE_LENGTH)
filtered_activities = filter_stream_by_status_type(
activities,
allowed_types=request.user.feed_status_types,
)
paginated = Paginator(filtered_activities, PAGE_LENGTH)
suggestions = suggested_users.get_suggestions(request.user)
@ -43,6 +58,9 @@ class Feed(View):
"tab": tab,
"streams": STREAMS,
"goal_form": forms.GoalForm(),
"feed_status_types_options": FeedFilterChoices,
"allowed_status_types": request.user.feed_status_types,
"settings_saved": settings_saved,
"path": f"/{tab['key']}",
},
}
@ -159,12 +177,19 @@ class Status(View):
params=[status.id, visible_thread, visible_thread],
)
preview = None
if hasattr(status, "book"):
preview = status.book.preview_image
elif status.mention_books.exists():
preview = status.mention_books.first().preview_image
data = {
**feed_page_data(request.user),
**{
"status": status,
"children": children,
"ancestors": ancestors,
"preview": preview,
},
}
return TemplateResponse(request, "feed/status.html", data)

View file

@ -6,6 +6,7 @@ import dateutil.tz
from dateutil.parser import ParserError
from requests import HTTPError
from django.db.models import Q
from django.http import Http404
from django.utils import translation
@ -153,3 +154,29 @@ def set_language(user, response):
translation.activate(user.preferred_language)
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, user.preferred_language)
return response
def filter_stream_by_status_type(activities, allowed_types=None):
"""filter out activities based on types"""
if not allowed_types:
allowed_types = []
if "review" not in allowed_types:
activities = activities.filter(
Q(review__isnull=True), Q(boost__boosted_status__review__isnull=True)
)
if "comment" not in allowed_types:
activities = activities.filter(
Q(comment__isnull=True), Q(boost__boosted_status__comment__isnull=True)
)
if "quotation" not in allowed_types:
activities = activities.filter(
Q(quotation__isnull=True), Q(boost__boosted_status__quotation__isnull=True)
)
if "everything" not in allowed_types:
activities = activities.filter(
Q(generatednote__isnull=True),
Q(boost__boosted_status__generatednote__isnull=True),
)
return activities

View file

@ -9,6 +9,7 @@ from django.views import View
from django.views.decorators.http import require_POST
from bookwyrm import models
from bookwyrm.views.shelf.shelf_actions import unshelve
from .status import CreateStatus
from .helpers import get_edition, handle_reading_status, is_api_request
from .helpers import load_date_in_user_tz_as_utc
@ -16,6 +17,7 @@ from .helpers import load_date_in_user_tz_as_utc
@method_decorator(login_required, name="dispatch")
# pylint: disable=no-self-use
# pylint: disable=too-many-return-statements
class ReadingStatus(View):
"""consider reading a book"""
@ -89,8 +91,21 @@ class ReadingStatus(View):
privacy = request.POST.get("privacy")
handle_reading_status(request.user, desired_shelf, book, privacy)
# if the request includes a "shelf" value we are using the 'move' button
if bool(request.POST.get("shelf")):
# unshelve the existing shelf
this_shelf = request.POST.get("shelf")
if (
bool(current_status_shelfbook)
and int(this_shelf) != int(current_status_shelfbook.shelf.id)
and current_status_shelfbook.shelf.identifier
!= desired_shelf.identifier
):
return unshelve(request, book_id=book_id)
if is_api_request(request):
return HttpResponse()
return redirect(referer)

View file

@ -91,13 +91,13 @@ def shelve(request):
@login_required
@require_POST
def unshelve(request):
def unshelve(request, book_id=False):
"""remove a book from a user's shelf"""
book = get_object_or_404(models.Edition, id=request.POST.get("book"))
identity = book_id if book_id else request.POST.get("book")
book = get_object_or_404(models.Edition, id=identity)
shelf_book = get_object_or_404(
models.ShelfBook, book=book, shelf__id=request.POST["shelf"]
)
shelf_book.raise_not_deletable(request.user)
shelf_book.delete()
return redirect(request.headers.get("Referer", "/"))

View file

@ -54,6 +54,7 @@ class CreateStatus(View):
data = {"book": book}
return TemplateResponse(request, "compose.html", data)
# pylint: disable=too-many-branches
def post(self, request, status_type, existing_status_id=None):
"""create status of whatever type"""
created = not existing_status_id
@ -117,11 +118,12 @@ class CreateStatus(View):
status.save(created=created)
# update a readthorugh, if needed
try:
edit_readthrough(request)
except Http404:
pass
# update a readthrough, if needed
if bool(request.POST.get("id")):
try:
edit_readthrough(request)
except Http404:
pass
if is_api_request(request):
return HttpResponse()

View file

@ -22,4 +22,9 @@ def get_unread_status_count(request, stream="home"):
stream = activitystreams.streams.get(stream)
if not stream:
return JsonResponse({})
return JsonResponse({"count": stream.get_unread_count(request.user)})
return JsonResponse(
{
"count": stream.get_unread_count(request.user),
"count_by_type": stream.get_unread_count_by_status_type(request.user),
}
)

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 18:03+0000\n"
"PO-Revision-Date: 2021-11-17 18:42\n"
"POT-Creation-Date: 2021-12-02 18:24+0000\n"
"PO-Revision-Date: 2021-12-02 21:41\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: German\n"
"Language: de\n"
@ -17,58 +17,58 @@ msgstr ""
"X-Crowdin-File: /[bookwyrm-social.bookwyrm] main/locale/en_US/LC_MESSAGES/django.po\n"
"X-Crowdin-File-ID: 1553\n"
#: bookwyrm/forms.py:248
#: bookwyrm/forms.py:262
msgid "A user with this email already exists."
msgstr "Es existiert bereits ein Benutzer*inkonto mit dieser E-Mail-Adresse."
#: bookwyrm/forms.py:262
#: bookwyrm/forms.py:276
msgid "One Day"
msgstr "Ein Tag"
#: bookwyrm/forms.py:263
#: bookwyrm/forms.py:277
msgid "One Week"
msgstr "Eine Woche"
#: bookwyrm/forms.py:264
#: bookwyrm/forms.py:278
msgid "One Month"
msgstr "Ein Monat"
#: bookwyrm/forms.py:265
#: bookwyrm/forms.py:279
msgid "Does Not Expire"
msgstr "Läuft nicht ab"
#: bookwyrm/forms.py:269
#: bookwyrm/forms.py:283
#, python-brace-format
msgid "{i} uses"
msgstr "{i}-mal verwendbar"
#: bookwyrm/forms.py:270
#: bookwyrm/forms.py:284
msgid "Unlimited"
msgstr "Unbegrenzt"
#: bookwyrm/forms.py:338
#: bookwyrm/forms.py:352
msgid "List Order"
msgstr "Reihenfolge der Liste"
#: bookwyrm/forms.py:339
#: bookwyrm/forms.py:353
msgid "Book Title"
msgstr "Buchtitel"
#: bookwyrm/forms.py:340 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/forms.py:354 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/templates/shelf/shelf.html:181
#: bookwyrm/templates/snippets/create_status/review.html:33
msgid "Rating"
msgstr "Bewertung"
#: bookwyrm/forms.py:342 bookwyrm/templates/lists/list.html:110
#: bookwyrm/forms.py:356 bookwyrm/templates/lists/list.html:110
msgid "Sort By"
msgstr "Sortieren nach"
#: bookwyrm/forms.py:346
#: bookwyrm/forms.py:360
msgid "Ascending"
msgstr "Aufsteigend"
#: bookwyrm/forms.py:347
#: bookwyrm/forms.py:361
msgid "Descending"
msgstr "Absteigend"
@ -152,6 +152,22 @@ msgstr "Benutzer*inname"
msgid "A user with that username already exists."
msgstr "Dieser Benutzer*inname ist bereits vergeben."
#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "Besprechungen"
#: bookwyrm/models/user.py:33
msgid "Comments"
msgstr ""
#: bookwyrm/models/user.py:34
msgid "Quotations"
msgstr ""
#: bookwyrm/models/user.py:35
msgid "Everything else"
msgstr ""
#: bookwyrm/settings.py:118
msgid "Home Timeline"
msgstr "Start-Zeitleiste"
@ -184,7 +200,7 @@ msgstr "Español (Spanisch)"
#: bookwyrm/settings.py:168
msgid "Galego (Galician)"
msgstr ""
msgstr "Galego (Galizisch)"
#: bookwyrm/settings.py:169
msgid "Français (French)"
@ -192,7 +208,7 @@ msgstr "Français (Französisch)"
#: bookwyrm/settings.py:170
msgid "Lietuvių (Lithuanian)"
msgstr ""
msgstr "Litauisch (Lithuanian)"
#: bookwyrm/settings.py:171
msgid "Português - Brasil (Brazilian Portuguese)"
@ -226,47 +242,51 @@ msgstr "Serverfehler"
msgid "Something went wrong! Sorry about that."
msgstr "Etwas ist schief gelaufen! Tut uns leid."
#: bookwyrm/templates/author/author.html:17
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
msgstr "Autor*in bearbeiten"
#: bookwyrm/templates/author/author.html:34
#: bookwyrm/templates/author/author.html:35
#: bookwyrm/templates/author/edit_author.html:43
msgid "Aliases:"
msgstr "Alternative Namen:"
#: bookwyrm/templates/author/author.html:45
#: bookwyrm/templates/author/author.html:46
msgid "Born:"
msgstr "Geboren:"
#: bookwyrm/templates/author/author.html:52
#: bookwyrm/templates/author/author.html:53
msgid "Died:"
msgstr "Gestorben:"
#: bookwyrm/templates/author/author.html:61
#: bookwyrm/templates/author/author.html:62
msgid "Wikipedia"
msgstr "Wikipedia"
#: bookwyrm/templates/author/author.html:69
#: bookwyrm/templates/author/author.html:70
msgid "View ISNI record"
msgstr "ISNI-Datensatz anzeigen"
#: bookwyrm/templates/author/author.html:78
#: bookwyrm/templates/book/book.html:94
msgid "View on OpenLibrary"
msgstr "Auf OpenLibrary ansehen"
#: bookwyrm/templates/author/author.html:77
#: bookwyrm/templates/author/author.html:86
#: bookwyrm/templates/book/book.html:97
msgid "View on Inventaire"
msgstr "Auf Inventaire anzeigen"
#: bookwyrm/templates/author/author.html:85
#: bookwyrm/templates/author/author.html:94
msgid "View on LibraryThing"
msgstr "Auf LibraryThing anzeigen"
#: bookwyrm/templates/author/author.html:93
#: bookwyrm/templates/author/author.html:102
msgid "View on Goodreads"
msgstr "Auf Goodreads ansehen"
#: bookwyrm/templates/author/author.html:108
#: bookwyrm/templates/author/author.html:117
#, python-format
msgid "Books by %(name)s"
msgstr "Bücher von %(name)s"
@ -276,17 +296,17 @@ msgid "Edit Author:"
msgstr "Autor*in bearbeiten:"
#: bookwyrm/templates/author/edit_author.html:13
#: bookwyrm/templates/book/edit/edit_book.html:18
#: bookwyrm/templates/book/edit/edit_book.html:19
msgid "Added:"
msgstr "Hinzugefügt:"
#: bookwyrm/templates/author/edit_author.html:14
#: bookwyrm/templates/book/edit/edit_book.html:21
#: bookwyrm/templates/book/edit/edit_book.html:22
msgid "Updated:"
msgstr "Aktualisiert:"
#: bookwyrm/templates/author/edit_author.html:16
#: bookwyrm/templates/book/edit/edit_book.html:25
#: bookwyrm/templates/book/edit/edit_book.html:26
msgid "Last edited by:"
msgstr "Zuletzt bearbeitet von:"
@ -346,7 +366,7 @@ msgstr "Goodreads-Schlüssel:"
#: bookwyrm/templates/author/edit_author.html:118
#: bookwyrm/templates/book/book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/book/edit/edit_book.html:121
#: bookwyrm/templates/book/readthrough.html:76
#: bookwyrm/templates/groups/form.html:24
#: bookwyrm/templates/lists/bookmark_button.html:15
@ -365,8 +385,8 @@ msgstr "Speichern"
#: bookwyrm/templates/author/edit_author.html:119
#: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190
#: bookwyrm/templates/book/cover_modal.html:32
#: bookwyrm/templates/book/edit/edit_book.html:112
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/readthrough.html:77
#: bookwyrm/templates/groups/delete_group_modal.html:17
#: bookwyrm/templates/lists/delete_list_modal.html:17
@ -444,10 +464,6 @@ msgstr "Erstellen"
msgid "You don't have any reading activity for this book."
msgstr "Du hast keine Leseaktivität für dieses Buch."
#: bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "Besprechungen"
#: bookwyrm/templates/book/book.html:223
msgid "Your reviews"
msgstr "Deine Besprechungen"
@ -512,56 +528,60 @@ msgstr "Titelbild hochladen:"
msgid "Load cover from url:"
msgstr "Titelbild von URL laden:"
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:11
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:12
#, python-format
msgid "Edit \"%(book_title)s\""
msgstr "„%(book_title)s“ bearbeiten"
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:13
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:14
msgid "Add Book"
msgstr "Buch hinzufügen"
#: bookwyrm/templates/book/edit/edit_book.html:47
#: bookwyrm/templates/book/edit/edit_book.html:48
msgid "Confirm Book Info"
msgstr "Buchinfo bestätigen"
#: bookwyrm/templates/book/edit/edit_book.html:55
#: bookwyrm/templates/book/edit/edit_book.html:56
#, python-format
msgid "Is \"%(name)s\" an existing author?"
msgstr "Existiert „%(name)s“ bereits als Autor*in?"
msgid "Is \"%(name)s\" one of these authors?"
msgstr "Ist \"%(name)s\" einer dieser Autoren?"
#: bookwyrm/templates/book/edit/edit_book.html:64
#, python-format
msgid "Author of <em>%(book_title)s</em>"
msgstr "Autor*in von <em>%(book_title)s</em>"
#: bookwyrm/templates/book/edit/edit_book.html:67
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Author of "
msgstr "Autor: "
#: bookwyrm/templates/book/edit/edit_book.html:68
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Find more information at isni.org"
msgstr "Weitere Informationen auf isni.org finden"
#: bookwyrm/templates/book/edit/edit_book.html:79
msgid "This is a new author"
msgstr "Neue*r Autor*in"
#: bookwyrm/templates/book/edit/edit_book.html:75
#: bookwyrm/templates/book/edit/edit_book.html:86
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Als neue*r Autor*in erstellen: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:82
#: bookwyrm/templates/book/edit/edit_book.html:93
msgid "Is this an edition of an existing work?"
msgstr "Ist das eine Ausgabe eines vorhandenen Werkes?"
#: bookwyrm/templates/book/edit/edit_book.html:90
#: bookwyrm/templates/book/edit/edit_book.html:101
msgid "This is a new work"
msgstr "Dies ist ein neues Werk."
#: bookwyrm/templates/book/edit/edit_book.html:97
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/landing/password_reset.html:30
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
msgid "Confirm"
msgstr "Bestätigen"
#: bookwyrm/templates/book/edit/edit_book.html:99
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/feed/status.html:9
msgid "Back"
msgstr "Zurück"
@ -1015,6 +1035,22 @@ msgstr "Du bist eingeladen, %(site_name)s beizutreten! Klicke auf den Link unten
msgid "Learn more about %(site_name)s:"
msgstr "Erfahre mehr über %(site_name)s:"
#: bookwyrm/templates/email/moderation_report/html_content.html:6
#: bookwyrm/templates/email/moderation_report/text_content.html:5
#, python-format
msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
msgstr ""
#: bookwyrm/templates/email/moderation_report/html_content.html:9
#: bookwyrm/templates/email/moderation_report/text_content.html:7
msgid "View report"
msgstr ""
#: bookwyrm/templates/email/moderation_report/subject.html:2
#, python-format
msgid "New report for %(site_name)s"
msgstr ""
#: bookwyrm/templates/email/password_reset/html_content.html:6
#: bookwyrm/templates/email/password_reset/text_content.html:4
#, python-format
@ -1057,15 +1093,31 @@ msgstr "Alle Nachrichten"
msgid "You have no messages right now."
msgstr "Du hast momentan keine Nachrichten."
#: bookwyrm/templates/feed/feed.html:22
#: bookwyrm/templates/feed/feed.html:23
msgid "Feed settings"
msgstr ""
#: bookwyrm/templates/feed/feed.html:26
msgid "Saved!"
msgstr ""
#: bookwyrm/templates/feed/feed.html:47
msgid "Save settings"
msgstr ""
#: bookwyrm/templates/feed/feed.html:56
#, python-format
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr "lade <span data-poll=\"stream/%(tab_key)s\">0</span> ungelesene Statusmeldung(en)"
#: bookwyrm/templates/feed/feed.html:38
#: bookwyrm/templates/feed/feed.html:72
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "Hier sind noch keine Aktivitäten! Folge Anderen, um loszulegen"
#: bookwyrm/templates/feed/feed.html:73
msgid "Alternatively, you can try enabling more status types"
msgstr ""
#: bookwyrm/templates/feed/goal_card.html:6
#: bookwyrm/templates/feed/layout.html:90
#: bookwyrm/templates/user/goal_form.html:6
@ -3841,7 +3893,7 @@ msgstr "Keine Follower*innen, denen du folgst"
msgid "File exceeds maximum size: 10MB"
msgstr "Datei überschreitet die maximale Größe von 10MB"
#: bookwyrm/templatetags/utilities.py:31
#: bookwyrm/templatetags/utilities.py:34
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 18:03+0000\n"
"PO-Revision-Date: 2021-11-19 18:53\n"
"POT-Creation-Date: 2021-12-02 18:24+0000\n"
"PO-Revision-Date: 2021-12-02 21:41\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Spanish\n"
"Language: es\n"
@ -17,58 +17,58 @@ msgstr ""
"X-Crowdin-File: /[bookwyrm-social.bookwyrm] main/locale/en_US/LC_MESSAGES/django.po\n"
"X-Crowdin-File-ID: 1553\n"
#: bookwyrm/forms.py:248
#: bookwyrm/forms.py:262
msgid "A user with this email already exists."
msgstr "Ya existe un usuario con ese correo electrónico."
#: bookwyrm/forms.py:262
#: bookwyrm/forms.py:276
msgid "One Day"
msgstr "Un día"
#: bookwyrm/forms.py:263
#: bookwyrm/forms.py:277
msgid "One Week"
msgstr "Una semana"
#: bookwyrm/forms.py:264
#: bookwyrm/forms.py:278
msgid "One Month"
msgstr "Un mes"
#: bookwyrm/forms.py:265
#: bookwyrm/forms.py:279
msgid "Does Not Expire"
msgstr "No expira"
#: bookwyrm/forms.py:269
#: bookwyrm/forms.py:283
#, python-brace-format
msgid "{i} uses"
msgstr "{i} usos"
#: bookwyrm/forms.py:270
#: bookwyrm/forms.py:284
msgid "Unlimited"
msgstr "Sin límite"
#: bookwyrm/forms.py:338
#: bookwyrm/forms.py:352
msgid "List Order"
msgstr "Orden de la lista"
#: bookwyrm/forms.py:339
#: bookwyrm/forms.py:353
msgid "Book Title"
msgstr "Título"
#: bookwyrm/forms.py:340 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/forms.py:354 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/templates/shelf/shelf.html:181
#: bookwyrm/templates/snippets/create_status/review.html:33
msgid "Rating"
msgstr "Calificación"
#: bookwyrm/forms.py:342 bookwyrm/templates/lists/list.html:110
#: bookwyrm/forms.py:356 bookwyrm/templates/lists/list.html:110
msgid "Sort By"
msgstr "Ordenar por"
#: bookwyrm/forms.py:346
#: bookwyrm/forms.py:360
msgid "Ascending"
msgstr "Ascendente"
#: bookwyrm/forms.py:347
#: bookwyrm/forms.py:361
msgid "Descending"
msgstr "Descendente"
@ -152,6 +152,22 @@ msgstr "nombre de usuario"
msgid "A user with that username already exists."
msgstr "Ya existe un usuario con ese nombre."
#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "Reseñas"
#: bookwyrm/models/user.py:33
msgid "Comments"
msgstr "Comentarios"
#: bookwyrm/models/user.py:34
msgid "Quotations"
msgstr "Citas"
#: bookwyrm/models/user.py:35
msgid "Everything else"
msgstr "Todo lo demás"
#: bookwyrm/settings.py:118
msgid "Home Timeline"
msgstr "Línea temporal de hogar"
@ -226,47 +242,51 @@ msgstr "Error de servidor"
msgid "Something went wrong! Sorry about that."
msgstr "¡Algo salió mal! Disculpa."
#: bookwyrm/templates/author/author.html:17
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
msgstr "Editar Autor/Autora"
#: bookwyrm/templates/author/author.html:34
#: bookwyrm/templates/author/author.html:35
#: bookwyrm/templates/author/edit_author.html:43
msgid "Aliases:"
msgstr "Alias:"
#: bookwyrm/templates/author/author.html:45
#: bookwyrm/templates/author/author.html:46
msgid "Born:"
msgstr "Nacido:"
#: bookwyrm/templates/author/author.html:52
#: bookwyrm/templates/author/author.html:53
msgid "Died:"
msgstr "Muerto:"
#: bookwyrm/templates/author/author.html:61
#: bookwyrm/templates/author/author.html:62
msgid "Wikipedia"
msgstr "Wikipedia"
#: bookwyrm/templates/author/author.html:69
#: bookwyrm/templates/author/author.html:70
msgid "View ISNI record"
msgstr "Ver registro ISNI"
#: bookwyrm/templates/author/author.html:78
#: bookwyrm/templates/book/book.html:94
msgid "View on OpenLibrary"
msgstr "Ver en OpenLibrary"
#: bookwyrm/templates/author/author.html:77
#: bookwyrm/templates/author/author.html:86
#: bookwyrm/templates/book/book.html:97
msgid "View on Inventaire"
msgstr "Ver en Inventaire"
#: bookwyrm/templates/author/author.html:85
#: bookwyrm/templates/author/author.html:94
msgid "View on LibraryThing"
msgstr "Ver en LibraryThing"
#: bookwyrm/templates/author/author.html:93
#: bookwyrm/templates/author/author.html:102
msgid "View on Goodreads"
msgstr "Ver en Goodreads"
#: bookwyrm/templates/author/author.html:108
#: bookwyrm/templates/author/author.html:117
#, python-format
msgid "Books by %(name)s"
msgstr "Libros de %(name)s"
@ -276,17 +296,17 @@ msgid "Edit Author:"
msgstr "Editar Autor/Autora/Autore:"
#: bookwyrm/templates/author/edit_author.html:13
#: bookwyrm/templates/book/edit/edit_book.html:18
#: bookwyrm/templates/book/edit/edit_book.html:19
msgid "Added:"
msgstr "Agregado:"
#: bookwyrm/templates/author/edit_author.html:14
#: bookwyrm/templates/book/edit/edit_book.html:21
#: bookwyrm/templates/book/edit/edit_book.html:22
msgid "Updated:"
msgstr "Actualizado:"
#: bookwyrm/templates/author/edit_author.html:16
#: bookwyrm/templates/book/edit/edit_book.html:25
#: bookwyrm/templates/book/edit/edit_book.html:26
msgid "Last edited by:"
msgstr "Editado más recientemente por:"
@ -346,7 +366,7 @@ msgstr "Clave Goodreads:"
#: bookwyrm/templates/author/edit_author.html:118
#: bookwyrm/templates/book/book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/book/edit/edit_book.html:121
#: bookwyrm/templates/book/readthrough.html:76
#: bookwyrm/templates/groups/form.html:24
#: bookwyrm/templates/lists/bookmark_button.html:15
@ -365,8 +385,8 @@ msgstr "Guardar"
#: bookwyrm/templates/author/edit_author.html:119
#: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190
#: bookwyrm/templates/book/cover_modal.html:32
#: bookwyrm/templates/book/edit/edit_book.html:112
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/readthrough.html:77
#: bookwyrm/templates/groups/delete_group_modal.html:17
#: bookwyrm/templates/lists/delete_list_modal.html:17
@ -444,10 +464,6 @@ msgstr "Crear"
msgid "You don't have any reading activity for this book."
msgstr "No tienes ninguna actividad de lectura para este libro."
#: bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "Reseñas"
#: bookwyrm/templates/book/book.html:223
msgid "Your reviews"
msgstr "Tus reseñas"
@ -512,56 +528,60 @@ msgstr "Subir portada:"
msgid "Load cover from url:"
msgstr "Agregar portada de url:"
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:11
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:12
#, python-format
msgid "Edit \"%(book_title)s\""
msgstr "Editar \"%(book_title)s\""
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:13
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:14
msgid "Add Book"
msgstr "Agregar libro"
#: bookwyrm/templates/book/edit/edit_book.html:47
#: bookwyrm/templates/book/edit/edit_book.html:48
msgid "Confirm Book Info"
msgstr "Confirmar información de libro"
#: bookwyrm/templates/book/edit/edit_book.html:55
#: bookwyrm/templates/book/edit/edit_book.html:56
#, python-format
msgid "Is \"%(name)s\" an existing author?"
msgstr "¿Es \"%(name)s\" un autor ya existente?"
msgid "Is \"%(name)s\" one of these authors?"
msgstr "¿Es \"%(name)s\" uno de estos autores?"
#: bookwyrm/templates/book/edit/edit_book.html:64
#, python-format
msgid "Author of <em>%(book_title)s</em>"
msgstr "Autor de <em>%(book_title)s</em>"
#: bookwyrm/templates/book/edit/edit_book.html:67
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Author of "
msgstr "Autor/a de "
#: bookwyrm/templates/book/edit/edit_book.html:68
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Find more information at isni.org"
msgstr "Más información en isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:79
msgid "This is a new author"
msgstr "Este es un autor nuevo"
#: bookwyrm/templates/book/edit/edit_book.html:75
#: bookwyrm/templates/book/edit/edit_book.html:86
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Creando un autor nuevo: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:82
#: bookwyrm/templates/book/edit/edit_book.html:93
msgid "Is this an edition of an existing work?"
msgstr "¿Es esta una edición de una obra ya existente?"
#: bookwyrm/templates/book/edit/edit_book.html:90
#: bookwyrm/templates/book/edit/edit_book.html:101
msgid "This is a new work"
msgstr "Esta es una obra nueva"
#: bookwyrm/templates/book/edit/edit_book.html:97
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/landing/password_reset.html:30
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
msgid "Confirm"
msgstr "Confirmar"
#: bookwyrm/templates/book/edit/edit_book.html:99
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/feed/status.html:9
msgid "Back"
msgstr "Volver"
@ -1015,6 +1035,22 @@ msgstr "Estás invitado a unirte con %(site_name)s! Haz clic en el enlace a cont
msgid "Learn more about %(site_name)s:"
msgstr "Más información sobre %(site_name)s:"
#: bookwyrm/templates/email/moderation_report/html_content.html:6
#: bookwyrm/templates/email/moderation_report/text_content.html:5
#, python-format
msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
msgstr "@%(reporter)s ha marcado el comportamiento de @%(reportee)s para moderar. "
#: bookwyrm/templates/email/moderation_report/html_content.html:9
#: bookwyrm/templates/email/moderation_report/text_content.html:7
msgid "View report"
msgstr "Ver informe"
#: bookwyrm/templates/email/moderation_report/subject.html:2
#, python-format
msgid "New report for %(site_name)s"
msgstr "Nuevo informe de %(site_name)s"
#: bookwyrm/templates/email/password_reset/html_content.html:6
#: bookwyrm/templates/email/password_reset/text_content.html:4
#, python-format
@ -1057,15 +1093,31 @@ msgstr "Todos los mensajes"
msgid "You have no messages right now."
msgstr "No tienes ningún mensaje en este momento."
#: bookwyrm/templates/feed/feed.html:22
#: bookwyrm/templates/feed/feed.html:23
msgid "Feed settings"
msgstr "Configuración del feed"
#: bookwyrm/templates/feed/feed.html:26
msgid "Saved!"
msgstr "¡Guardado!"
#: bookwyrm/templates/feed/feed.html:47
msgid "Save settings"
msgstr "Guardar ajustes"
#: bookwyrm/templates/feed/feed.html:56
#, python-format
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr "cargar <span data-poll=\"stream/%(tab_key)s\">0</span> estado(s) no leído(s)"
#: bookwyrm/templates/feed/feed.html:38
#: bookwyrm/templates/feed/feed.html:72
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "¡No hay actividad ahora mismo! Sigue a otro usuario para empezar"
#: bookwyrm/templates/feed/feed.html:73
msgid "Alternatively, you can try enabling more status types"
msgstr "Alternativamente, puedes intentar habilitar más tipos de estado"
#: bookwyrm/templates/feed/goal_card.html:6
#: bookwyrm/templates/feed/layout.html:90
#: bookwyrm/templates/user/goal_form.html:6
@ -3841,7 +3893,7 @@ msgstr "Ningún seguidor que tu sigues"
msgid "File exceeds maximum size: 10MB"
msgstr "Archivo excede el tamaño máximo: 10MB"
#: bookwyrm/templatetags/utilities.py:31
#: bookwyrm/templatetags/utilities.py:34
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 18:03+0000\n"
"PO-Revision-Date: 2021-11-22 19:37\n"
"POT-Creation-Date: 2021-12-02 18:24+0000\n"
"PO-Revision-Date: 2021-12-02 21:40\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: French\n"
"Language: fr\n"
@ -17,58 +17,58 @@ msgstr ""
"X-Crowdin-File: /[bookwyrm-social.bookwyrm] main/locale/en_US/LC_MESSAGES/django.po\n"
"X-Crowdin-File-ID: 1553\n"
#: bookwyrm/forms.py:248
#: bookwyrm/forms.py:262
msgid "A user with this email already exists."
msgstr "Cet email est déjà associé à un compte."
#: bookwyrm/forms.py:262
#: bookwyrm/forms.py:276
msgid "One Day"
msgstr "Un jour"
#: bookwyrm/forms.py:263
#: bookwyrm/forms.py:277
msgid "One Week"
msgstr "Une semaine"
#: bookwyrm/forms.py:264
#: bookwyrm/forms.py:278
msgid "One Month"
msgstr "Un mois"
#: bookwyrm/forms.py:265
#: bookwyrm/forms.py:279
msgid "Does Not Expire"
msgstr "Sans expiration"
#: bookwyrm/forms.py:269
#: bookwyrm/forms.py:283
#, python-brace-format
msgid "{i} uses"
msgstr "{i} utilisations"
#: bookwyrm/forms.py:270
#: bookwyrm/forms.py:284
msgid "Unlimited"
msgstr "Sans limite"
#: bookwyrm/forms.py:338
#: bookwyrm/forms.py:352
msgid "List Order"
msgstr "Ordre de la liste"
#: bookwyrm/forms.py:339
#: bookwyrm/forms.py:353
msgid "Book Title"
msgstr "Titre du livre"
#: bookwyrm/forms.py:340 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/forms.py:354 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/templates/shelf/shelf.html:181
#: bookwyrm/templates/snippets/create_status/review.html:33
msgid "Rating"
msgstr "Note"
#: bookwyrm/forms.py:342 bookwyrm/templates/lists/list.html:110
#: bookwyrm/forms.py:356 bookwyrm/templates/lists/list.html:110
msgid "Sort By"
msgstr "Trier par"
#: bookwyrm/forms.py:346
#: bookwyrm/forms.py:360
msgid "Ascending"
msgstr "Ordre croissant"
#: bookwyrm/forms.py:347
#: bookwyrm/forms.py:361
msgid "Descending"
msgstr "Ordre décroissant"
@ -152,6 +152,22 @@ msgstr "nom du compte:"
msgid "A user with that username already exists."
msgstr "Ce nom est déjà associé à un compte."
#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "Critiques"
#: bookwyrm/models/user.py:33
msgid "Comments"
msgstr ""
#: bookwyrm/models/user.py:34
msgid "Quotations"
msgstr ""
#: bookwyrm/models/user.py:35
msgid "Everything else"
msgstr ""
#: bookwyrm/settings.py:118
msgid "Home Timeline"
msgstr "Mon fil dactualité"
@ -226,47 +242,51 @@ msgstr "Erreur côté serveur"
msgid "Something went wrong! Sorry about that."
msgstr "Une erreur sest produite; désolé!"
#: bookwyrm/templates/author/author.html:17
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
msgstr "Modifier lauteur ou autrice"
#: bookwyrm/templates/author/author.html:34
#: bookwyrm/templates/author/author.html:35
#: bookwyrm/templates/author/edit_author.html:43
msgid "Aliases:"
msgstr "Pseudonymes:"
#: bookwyrm/templates/author/author.html:45
#: bookwyrm/templates/author/author.html:46
msgid "Born:"
msgstr "Naissance:"
#: bookwyrm/templates/author/author.html:52
#: bookwyrm/templates/author/author.html:53
msgid "Died:"
msgstr "Décès:"
#: bookwyrm/templates/author/author.html:61
#: bookwyrm/templates/author/author.html:62
msgid "Wikipedia"
msgstr "Wikipedia"
#: bookwyrm/templates/author/author.html:69
#: bookwyrm/templates/author/author.html:70
msgid "View ISNI record"
msgstr "Voir lenregistrement ISNI"
#: bookwyrm/templates/author/author.html:78
#: bookwyrm/templates/book/book.html:94
msgid "View on OpenLibrary"
msgstr "Voir sur OpenLibrary"
#: bookwyrm/templates/author/author.html:77
#: bookwyrm/templates/author/author.html:86
#: bookwyrm/templates/book/book.html:97
msgid "View on Inventaire"
msgstr "Voir sur Inventaire"
#: bookwyrm/templates/author/author.html:85
#: bookwyrm/templates/author/author.html:94
msgid "View on LibraryThing"
msgstr "Voir sur LibraryThing"
#: bookwyrm/templates/author/author.html:93
#: bookwyrm/templates/author/author.html:102
msgid "View on Goodreads"
msgstr "Voir sur Goodreads"
#: bookwyrm/templates/author/author.html:108
#: bookwyrm/templates/author/author.html:117
#, python-format
msgid "Books by %(name)s"
msgstr "Livres de %(name)s"
@ -276,17 +296,17 @@ msgid "Edit Author:"
msgstr "Modifier lauteur ou lautrice:"
#: bookwyrm/templates/author/edit_author.html:13
#: bookwyrm/templates/book/edit/edit_book.html:18
#: bookwyrm/templates/book/edit/edit_book.html:19
msgid "Added:"
msgstr "Ajouté:"
#: bookwyrm/templates/author/edit_author.html:14
#: bookwyrm/templates/book/edit/edit_book.html:21
#: bookwyrm/templates/book/edit/edit_book.html:22
msgid "Updated:"
msgstr "Mis à jour:"
#: bookwyrm/templates/author/edit_author.html:16
#: bookwyrm/templates/book/edit/edit_book.html:25
#: bookwyrm/templates/book/edit/edit_book.html:26
msgid "Last edited by:"
msgstr "Dernière modification par:"
@ -346,7 +366,7 @@ msgstr "Clé Goodreads:"
#: bookwyrm/templates/author/edit_author.html:118
#: bookwyrm/templates/book/book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/book/edit/edit_book.html:121
#: bookwyrm/templates/book/readthrough.html:76
#: bookwyrm/templates/groups/form.html:24
#: bookwyrm/templates/lists/bookmark_button.html:15
@ -365,8 +385,8 @@ msgstr "Enregistrer"
#: bookwyrm/templates/author/edit_author.html:119
#: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190
#: bookwyrm/templates/book/cover_modal.html:32
#: bookwyrm/templates/book/edit/edit_book.html:112
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/readthrough.html:77
#: bookwyrm/templates/groups/delete_group_modal.html:17
#: bookwyrm/templates/lists/delete_list_modal.html:17
@ -444,10 +464,6 @@ msgstr "Créer"
msgid "You don't have any reading activity for this book."
msgstr "Vous navez aucune activité de lecture pour ce livre"
#: bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "Critiques"
#: bookwyrm/templates/book/book.html:223
msgid "Your reviews"
msgstr "Vos critiques"
@ -512,56 +528,60 @@ msgstr "Charger une couverture:"
msgid "Load cover from url:"
msgstr "Charger la couverture depuis une URL:"
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:11
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:12
#, python-format
msgid "Edit \"%(book_title)s\""
msgstr "Modifier « %(book_title)s»"
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:13
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:14
msgid "Add Book"
msgstr "Ajouter un livre"
#: bookwyrm/templates/book/edit/edit_book.html:47
#: bookwyrm/templates/book/edit/edit_book.html:48
msgid "Confirm Book Info"
msgstr "Confirmer les informations de ce livre"
#: bookwyrm/templates/book/edit/edit_book.html:55
#: bookwyrm/templates/book/edit/edit_book.html:56
#, python-format
msgid "Is \"%(name)s\" an existing author?"
msgstr "Estce que lauteur/autrice « %(name)s» existe déjà?"
msgid "Is \"%(name)s\" one of these authors?"
msgstr "Est-ce que \"%(name)s\" fait partie de ces auteurs ou autrices ?"
#: bookwyrm/templates/book/edit/edit_book.html:64
#, python-format
msgid "Author of <em>%(book_title)s</em>"
msgstr "Auteur/autrice de <em>%(book_title)s</em>"
#: bookwyrm/templates/book/edit/edit_book.html:67
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Author of "
msgstr "Auteur ou autrice de "
#: bookwyrm/templates/book/edit/edit_book.html:68
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Find more information at isni.org"
msgstr "Trouver plus dinformations sur isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:79
msgid "This is a new author"
msgstr "Il sagit dun nouvel auteur ou dune nouvelle autrice."
#: bookwyrm/templates/book/edit/edit_book.html:75
#: bookwyrm/templates/book/edit/edit_book.html:86
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Création dun nouvel auteur/autrice: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:82
#: bookwyrm/templates/book/edit/edit_book.html:93
msgid "Is this an edition of an existing work?"
msgstr "Estce lédition dun ouvrage existant?"
#: bookwyrm/templates/book/edit/edit_book.html:90
#: bookwyrm/templates/book/edit/edit_book.html:101
msgid "This is a new work"
msgstr "Il sagit dun nouvel ouvrage."
#: bookwyrm/templates/book/edit/edit_book.html:97
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/landing/password_reset.html:30
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
msgid "Confirm"
msgstr "Confirmer"
#: bookwyrm/templates/book/edit/edit_book.html:99
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/feed/status.html:9
msgid "Back"
msgstr "Retour"
@ -1015,6 +1035,22 @@ msgstr "Vous avez reçu une invitation à rejoindre %(site_name)s! Cliquez le
msgid "Learn more about %(site_name)s:"
msgstr "En savoir plus sur %(site_name)s :"
#: bookwyrm/templates/email/moderation_report/html_content.html:6
#: bookwyrm/templates/email/moderation_report/text_content.html:5
#, python-format
msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
msgstr "@%(reporter)s a signalé un comportement de @%(reportee)s pour modération. "
#: bookwyrm/templates/email/moderation_report/html_content.html:9
#: bookwyrm/templates/email/moderation_report/text_content.html:7
msgid "View report"
msgstr "Voir le signalement"
#: bookwyrm/templates/email/moderation_report/subject.html:2
#, python-format
msgid "New report for %(site_name)s"
msgstr "Nouveau signalement pour %(site_name)s"
#: bookwyrm/templates/email/password_reset/html_content.html:6
#: bookwyrm/templates/email/password_reset/text_content.html:4
#, python-format
@ -1057,15 +1093,31 @@ msgstr "Tous les messages"
msgid "You have no messages right now."
msgstr "Vous navez aucun message pour linstant."
#: bookwyrm/templates/feed/feed.html:22
#: bookwyrm/templates/feed/feed.html:23
msgid "Feed settings"
msgstr ""
#: bookwyrm/templates/feed/feed.html:26
msgid "Saved!"
msgstr ""
#: bookwyrm/templates/feed/feed.html:47
msgid "Save settings"
msgstr ""
#: bookwyrm/templates/feed/feed.html:56
#, python-format
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr "charger <span data-poll=\"stream/%(tab_key)s\">0</span> statut(s) non lus"
#: bookwyrm/templates/feed/feed.html:38
#: bookwyrm/templates/feed/feed.html:72
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "Aucune activité pour linstant! Abonnezvous à quelquun pour commencer"
#: bookwyrm/templates/feed/feed.html:73
msgid "Alternatively, you can try enabling more status types"
msgstr ""
#: bookwyrm/templates/feed/goal_card.html:6
#: bookwyrm/templates/feed/layout.html:90
#: bookwyrm/templates/user/goal_form.html:6
@ -3841,7 +3893,7 @@ msgstr "Aucun·e abonné·e que vous suivez"
msgid "File exceeds maximum size: 10MB"
msgstr "Ce fichier dépasse la taille limite: 10Mo"
#: bookwyrm/templatetags/utilities.py:31
#: bookwyrm/templatetags/utilities.py:34
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s (%(subtitle)s)"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 18:03+0000\n"
"PO-Revision-Date: 2021-11-19 17:43\n"
"POT-Creation-Date: 2021-12-02 18:24+0000\n"
"PO-Revision-Date: 2021-12-03 05:48\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Galician\n"
"Language: gl\n"
@ -17,58 +17,58 @@ msgstr ""
"X-Crowdin-File: /[bookwyrm-social.bookwyrm] main/locale/en_US/LC_MESSAGES/django.po\n"
"X-Crowdin-File-ID: 1553\n"
#: bookwyrm/forms.py:248
msgid "A user with this email already exists."
msgstr "Xa existe unha unsuaria con este email."
#: bookwyrm/forms.py:262
msgid "A user with this email already exists."
msgstr "Xa existe unha usuaria con este email."
#: bookwyrm/forms.py:276
msgid "One Day"
msgstr "Un día"
#: bookwyrm/forms.py:263
#: bookwyrm/forms.py:277
msgid "One Week"
msgstr "Unha semana"
#: bookwyrm/forms.py:264
#: bookwyrm/forms.py:278
msgid "One Month"
msgstr "Un mes"
#: bookwyrm/forms.py:265
#: bookwyrm/forms.py:279
msgid "Does Not Expire"
msgstr "Non caduca"
#: bookwyrm/forms.py:269
#: bookwyrm/forms.py:283
#, python-brace-format
msgid "{i} uses"
msgstr "{i} usos"
#: bookwyrm/forms.py:270
#: bookwyrm/forms.py:284
msgid "Unlimited"
msgstr "Sen límite"
#: bookwyrm/forms.py:338
#: bookwyrm/forms.py:352
msgid "List Order"
msgstr "Orde da listaxe"
#: bookwyrm/forms.py:339
#: bookwyrm/forms.py:353
msgid "Book Title"
msgstr "Título do libro"
#: bookwyrm/forms.py:340 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/forms.py:354 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/templates/shelf/shelf.html:181
#: bookwyrm/templates/snippets/create_status/review.html:33
msgid "Rating"
msgstr "Puntuación"
#: bookwyrm/forms.py:342 bookwyrm/templates/lists/list.html:110
#: bookwyrm/forms.py:356 bookwyrm/templates/lists/list.html:110
msgid "Sort By"
msgstr "Ordenar por"
#: bookwyrm/forms.py:346
#: bookwyrm/forms.py:360
msgid "Ascending"
msgstr "Ascendente"
#: bookwyrm/forms.py:347
#: bookwyrm/forms.py:361
msgid "Descending"
msgstr "Descendente"
@ -152,6 +152,22 @@ msgstr "nome de usuaria"
msgid "A user with that username already exists."
msgstr "Xa existe unha usuaria con ese nome."
#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "Recensións"
#: bookwyrm/models/user.py:33
msgid "Comments"
msgstr "Comentarios"
#: bookwyrm/models/user.py:34
msgid "Quotations"
msgstr "Citas"
#: bookwyrm/models/user.py:35
msgid "Everything else"
msgstr "As outras cousas"
#: bookwyrm/settings.py:118
msgid "Home Timeline"
msgstr "Cronoloxía de Inicio"
@ -226,47 +242,51 @@ msgstr "Erro do servidor"
msgid "Something went wrong! Sorry about that."
msgstr "Algo fallou! Lamentámolo."
#: bookwyrm/templates/author/author.html:17
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
msgstr "Editar Autora"
#: bookwyrm/templates/author/author.html:34
#: bookwyrm/templates/author/author.html:35
#: bookwyrm/templates/author/edit_author.html:43
msgid "Aliases:"
msgstr "Alias:"
#: bookwyrm/templates/author/author.html:45
#: bookwyrm/templates/author/author.html:46
msgid "Born:"
msgstr "Nacemento:"
#: bookwyrm/templates/author/author.html:52
#: bookwyrm/templates/author/author.html:53
msgid "Died:"
msgstr "Morte:"
#: bookwyrm/templates/author/author.html:61
#: bookwyrm/templates/author/author.html:62
msgid "Wikipedia"
msgstr "Wikipedia"
#: bookwyrm/templates/author/author.html:69
#: bookwyrm/templates/author/author.html:70
msgid "View ISNI record"
msgstr "Ver rexistro ISNI"
#: bookwyrm/templates/author/author.html:78
#: bookwyrm/templates/book/book.html:94
msgid "View on OpenLibrary"
msgstr "Ver en OpenLibrary"
#: bookwyrm/templates/author/author.html:77
#: bookwyrm/templates/author/author.html:86
#: bookwyrm/templates/book/book.html:97
msgid "View on Inventaire"
msgstr "Ver en Inventaire"
#: bookwyrm/templates/author/author.html:85
#: bookwyrm/templates/author/author.html:94
msgid "View on LibraryThing"
msgstr "Ver en LibraryThing"
#: bookwyrm/templates/author/author.html:93
#: bookwyrm/templates/author/author.html:102
msgid "View on Goodreads"
msgstr "Ver en Goodreads"
#: bookwyrm/templates/author/author.html:108
#: bookwyrm/templates/author/author.html:117
#, python-format
msgid "Books by %(name)s"
msgstr "Libros de %(name)s"
@ -276,17 +296,17 @@ msgid "Edit Author:"
msgstr "Editar autora:"
#: bookwyrm/templates/author/edit_author.html:13
#: bookwyrm/templates/book/edit/edit_book.html:18
#: bookwyrm/templates/book/edit/edit_book.html:19
msgid "Added:"
msgstr "Engadida:"
#: bookwyrm/templates/author/edit_author.html:14
#: bookwyrm/templates/book/edit/edit_book.html:21
#: bookwyrm/templates/book/edit/edit_book.html:22
msgid "Updated:"
msgstr "Actualizada:"
#: bookwyrm/templates/author/edit_author.html:16
#: bookwyrm/templates/book/edit/edit_book.html:25
#: bookwyrm/templates/book/edit/edit_book.html:26
msgid "Last edited by:"
msgstr "Última edición por:"
@ -346,7 +366,7 @@ msgstr "Chave en Goodreads:"
#: bookwyrm/templates/author/edit_author.html:118
#: bookwyrm/templates/book/book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/book/edit/edit_book.html:121
#: bookwyrm/templates/book/readthrough.html:76
#: bookwyrm/templates/groups/form.html:24
#: bookwyrm/templates/lists/bookmark_button.html:15
@ -365,8 +385,8 @@ msgstr "Gardar"
#: bookwyrm/templates/author/edit_author.html:119
#: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190
#: bookwyrm/templates/book/cover_modal.html:32
#: bookwyrm/templates/book/edit/edit_book.html:112
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/readthrough.html:77
#: bookwyrm/templates/groups/delete_group_modal.html:17
#: bookwyrm/templates/lists/delete_list_modal.html:17
@ -444,10 +464,6 @@ msgstr "Crear"
msgid "You don't have any reading activity for this book."
msgstr "Non tes actividade lectora neste libro."
#: bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "Recensións"
#: bookwyrm/templates/book/book.html:223
msgid "Your reviews"
msgstr "As túas recensións"
@ -512,56 +528,60 @@ msgstr "Subir portada:"
msgid "Load cover from url:"
msgstr "Cargar portada desde url:"
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:11
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:12
#, python-format
msgid "Edit \"%(book_title)s\""
msgstr "Editar \"%(book_title)s\""
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:13
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:14
msgid "Add Book"
msgstr "Engadir libro"
#: bookwyrm/templates/book/edit/edit_book.html:47
#: bookwyrm/templates/book/edit/edit_book.html:48
msgid "Confirm Book Info"
msgstr "Confirma info do libro"
#: bookwyrm/templates/book/edit/edit_book.html:55
#: bookwyrm/templates/book/edit/edit_book.html:56
#, python-format
msgid "Is \"%(name)s\" an existing author?"
msgstr "É \"%(name)s\" unha autora existente?"
msgid "Is \"%(name)s\" one of these authors?"
msgstr "É \"%(name)s\" un destas autoras?"
#: bookwyrm/templates/book/edit/edit_book.html:64
#, python-format
msgid "Author of <em>%(book_title)s</em>"
msgstr "Autora de <em>%(book_title)s</em>"
#: bookwyrm/templates/book/edit/edit_book.html:67
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Author of "
msgstr "Autora de "
#: bookwyrm/templates/book/edit/edit_book.html:68
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Find more information at isni.org"
msgstr "Atopa máis información en isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:79
msgid "This is a new author"
msgstr "Esta é unha nova autora"
#: bookwyrm/templates/book/edit/edit_book.html:75
#: bookwyrm/templates/book/edit/edit_book.html:86
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Creando nova autora: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:82
#: bookwyrm/templates/book/edit/edit_book.html:93
msgid "Is this an edition of an existing work?"
msgstr "É esta a edición dun traballo existente?"
#: bookwyrm/templates/book/edit/edit_book.html:90
#: bookwyrm/templates/book/edit/edit_book.html:101
msgid "This is a new work"
msgstr "Este é un novo traballo"
#: bookwyrm/templates/book/edit/edit_book.html:97
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/landing/password_reset.html:30
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
msgid "Confirm"
msgstr "Confirmar"
#: bookwyrm/templates/book/edit/edit_book.html:99
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/feed/status.html:9
msgid "Back"
msgstr "Atrás"
@ -1015,6 +1035,22 @@ msgstr "Foches convidada a unirte a %(site_name)s! Preme na ligazón para crear
msgid "Learn more about %(site_name)s:"
msgstr "Coñece máis acerca de %(site_name)s:"
#: bookwyrm/templates/email/moderation_report/html_content.html:6
#: bookwyrm/templates/email/moderation_report/text_content.html:5
#, python-format
msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
msgstr "@%(reporter)s marcou o comportamento de @%(reportee)s para revisión. "
#: bookwyrm/templates/email/moderation_report/html_content.html:9
#: bookwyrm/templates/email/moderation_report/text_content.html:7
msgid "View report"
msgstr "Ver denuncia"
#: bookwyrm/templates/email/moderation_report/subject.html:2
#, python-format
msgid "New report for %(site_name)s"
msgstr "Nova denuncia en %(site_name)s"
#: bookwyrm/templates/email/password_reset/html_content.html:6
#: bookwyrm/templates/email/password_reset/text_content.html:4
#, python-format
@ -1057,15 +1093,31 @@ msgstr "Tódalas mensaxes"
msgid "You have no messages right now."
msgstr "Non tes mensaxes por agora."
#: bookwyrm/templates/feed/feed.html:22
#: bookwyrm/templates/feed/feed.html:23
msgid "Feed settings"
msgstr "Axustes da cronoloxía"
#: bookwyrm/templates/feed/feed.html:26
msgid "Saved!"
msgstr "Gardados!"
#: bookwyrm/templates/feed/feed.html:47
msgid "Save settings"
msgstr "Gardar axustes"
#: bookwyrm/templates/feed/feed.html:56
#, python-format
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr "cargar <span data-poll=\"stream/%(tab_key)s\">0</span> estado(s) non lidos"
#: bookwyrm/templates/feed/feed.html:38
#: bookwyrm/templates/feed/feed.html:72
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "Non hai actividade por agora! Proba a seguir algunha persoa para comezar"
#: bookwyrm/templates/feed/feed.html:73
msgid "Alternatively, you can try enabling more status types"
msgstr "De xeito alternativo, podes activar máis tipos de estados"
#: bookwyrm/templates/feed/goal_card.html:6
#: bookwyrm/templates/feed/layout.html:90
#: bookwyrm/templates/user/goal_form.html:6
@ -3841,7 +3893,7 @@ msgstr "Sen seguidoras que ti segues"
msgid "File exceeds maximum size: 10MB"
msgstr "O ficheiro supera o tamaño máximo: 10MB"
#: bookwyrm/templatetags/utilities.py:31
#: bookwyrm/templatetags/utilities.py:34
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 18:03+0000\n"
"PO-Revision-Date: 2021-11-22 08:50\n"
"POT-Creation-Date: 2021-12-02 18:24+0000\n"
"PO-Revision-Date: 2021-12-04 18:09\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Lithuanian\n"
"Language: lt\n"
@ -17,58 +17,58 @@ msgstr ""
"X-Crowdin-File: /[bookwyrm-social.bookwyrm] main/locale/en_US/LC_MESSAGES/django.po\n"
"X-Crowdin-File-ID: 1553\n"
#: bookwyrm/forms.py:248
#: bookwyrm/forms.py:262
msgid "A user with this email already exists."
msgstr "Vartotojas su šiuo el. pašto adresu jau yra."
#: bookwyrm/forms.py:262
#: bookwyrm/forms.py:276
msgid "One Day"
msgstr "Diena"
#: bookwyrm/forms.py:263
#: bookwyrm/forms.py:277
msgid "One Week"
msgstr "Savaitė"
#: bookwyrm/forms.py:264
#: bookwyrm/forms.py:278
msgid "One Month"
msgstr "Mėnuo"
#: bookwyrm/forms.py:265
#: bookwyrm/forms.py:279
msgid "Does Not Expire"
msgstr "Galiojimas nesibaigia"
#: bookwyrm/forms.py:269
#: bookwyrm/forms.py:283
#, python-brace-format
msgid "{i} uses"
msgstr "{i} naudoja"
#: bookwyrm/forms.py:270
#: bookwyrm/forms.py:284
msgid "Unlimited"
msgstr "Neribota"
#: bookwyrm/forms.py:338
#: bookwyrm/forms.py:352
msgid "List Order"
msgstr "Kaip pridėta į sąrašą"
#: bookwyrm/forms.py:339
#: bookwyrm/forms.py:353
msgid "Book Title"
msgstr "Knygos antraštė"
#: bookwyrm/forms.py:340 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/forms.py:354 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/templates/shelf/shelf.html:181
#: bookwyrm/templates/snippets/create_status/review.html:33
msgid "Rating"
msgstr "Įvertinimas"
#: bookwyrm/forms.py:342 bookwyrm/templates/lists/list.html:110
#: bookwyrm/forms.py:356 bookwyrm/templates/lists/list.html:110
msgid "Sort By"
msgstr "Rūšiuoti pagal"
#: bookwyrm/forms.py:346
#: bookwyrm/forms.py:360
msgid "Ascending"
msgstr "Didėjančia tvarka"
#: bookwyrm/forms.py:347
#: bookwyrm/forms.py:361
msgid "Descending"
msgstr "Mažėjančia tvarka"
@ -152,6 +152,22 @@ msgstr "naudotojo vardas"
msgid "A user with that username already exists."
msgstr "Toks naudotojo vardas jau egzistuoja."
#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "Apžvalgos"
#: bookwyrm/models/user.py:33
msgid "Comments"
msgstr "Komentarai"
#: bookwyrm/models/user.py:34
msgid "Quotations"
msgstr "Citatos"
#: bookwyrm/models/user.py:35
msgid "Everything else"
msgstr "Visa kita"
#: bookwyrm/settings.py:118
msgid "Home Timeline"
msgstr "Pagrindinė siena"
@ -226,47 +242,51 @@ msgstr "Serverio klaida"
msgid "Something went wrong! Sorry about that."
msgstr "Kažkas nepavyko. Atsiprašome."
#: bookwyrm/templates/author/author.html:17
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
msgstr "Keisti autorių"
#: bookwyrm/templates/author/author.html:34
#: bookwyrm/templates/author/author.html:35
#: bookwyrm/templates/author/edit_author.html:43
msgid "Aliases:"
msgstr "Pseudonimai:"
#: bookwyrm/templates/author/author.html:45
#: bookwyrm/templates/author/author.html:46
msgid "Born:"
msgstr "Gimęs:"
#: bookwyrm/templates/author/author.html:52
#: bookwyrm/templates/author/author.html:53
msgid "Died:"
msgstr "Mirė:"
#: bookwyrm/templates/author/author.html:61
#: bookwyrm/templates/author/author.html:62
msgid "Wikipedia"
msgstr "Wikipedia"
#: bookwyrm/templates/author/author.html:69
#: bookwyrm/templates/author/author.html:70
msgid "View ISNI record"
msgstr "Peržiūrėti ISNI įrašą"
#: bookwyrm/templates/author/author.html:78
#: bookwyrm/templates/book/book.html:94
msgid "View on OpenLibrary"
msgstr "Žiūrėti „OpenLibrary“"
#: bookwyrm/templates/author/author.html:77
#: bookwyrm/templates/author/author.html:86
#: bookwyrm/templates/book/book.html:97
msgid "View on Inventaire"
msgstr "Žiūrėti „Inventaire“"
#: bookwyrm/templates/author/author.html:85
#: bookwyrm/templates/author/author.html:94
msgid "View on LibraryThing"
msgstr "Žiūrėti „LibraryThing“"
#: bookwyrm/templates/author/author.html:93
#: bookwyrm/templates/author/author.html:102
msgid "View on Goodreads"
msgstr "Žiūrėti „Goodreads“"
#: bookwyrm/templates/author/author.html:108
#: bookwyrm/templates/author/author.html:117
#, python-format
msgid "Books by %(name)s"
msgstr "%(name)s knygos"
@ -276,17 +296,17 @@ msgid "Edit Author:"
msgstr "Keisti autorių:"
#: bookwyrm/templates/author/edit_author.html:13
#: bookwyrm/templates/book/edit/edit_book.html:18
#: bookwyrm/templates/book/edit/edit_book.html:19
msgid "Added:"
msgstr "Pridėta:"
#: bookwyrm/templates/author/edit_author.html:14
#: bookwyrm/templates/book/edit/edit_book.html:21
#: bookwyrm/templates/book/edit/edit_book.html:22
msgid "Updated:"
msgstr "Atnaujinta:"
#: bookwyrm/templates/author/edit_author.html:16
#: bookwyrm/templates/book/edit/edit_book.html:25
#: bookwyrm/templates/book/edit/edit_book.html:26
msgid "Last edited by:"
msgstr "Pastarąjį kartą redagavo:"
@ -346,7 +366,7 @@ msgstr "„Goodreads“ raktas:"
#: bookwyrm/templates/author/edit_author.html:118
#: bookwyrm/templates/book/book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/book/edit/edit_book.html:121
#: bookwyrm/templates/book/readthrough.html:76
#: bookwyrm/templates/groups/form.html:24
#: bookwyrm/templates/lists/bookmark_button.html:15
@ -365,8 +385,8 @@ msgstr "Išsaugoti"
#: bookwyrm/templates/author/edit_author.html:119
#: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190
#: bookwyrm/templates/book/cover_modal.html:32
#: bookwyrm/templates/book/edit/edit_book.html:112
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/readthrough.html:77
#: bookwyrm/templates/groups/delete_group_modal.html:17
#: bookwyrm/templates/lists/delete_list_modal.html:17
@ -446,10 +466,6 @@ msgstr "Kurti"
msgid "You don't have any reading activity for this book."
msgstr "Šios knygos neskaitote."
#: bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "Apžvalgos"
#: bookwyrm/templates/book/book.html:223
msgid "Your reviews"
msgstr "Tavo atsiliepimai"
@ -514,56 +530,60 @@ msgstr "Įkelti viršelį:"
msgid "Load cover from url:"
msgstr "Įkelti viršelį iš url:"
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:11
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:12
#, python-format
msgid "Edit \"%(book_title)s\""
msgstr "Redaguoti „%(book_title)s“"
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:13
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:14
msgid "Add Book"
msgstr "Pridėti knygą"
#: bookwyrm/templates/book/edit/edit_book.html:47
#: bookwyrm/templates/book/edit/edit_book.html:48
msgid "Confirm Book Info"
msgstr "Patvirtinti knygos informaciją"
#: bookwyrm/templates/book/edit/edit_book.html:55
#: bookwyrm/templates/book/edit/edit_book.html:56
#, python-format
msgid "Is \"%(name)s\" an existing author?"
msgstr "Yra „%(name)s“ egzistuojantis autorius?"
msgid "Is \"%(name)s\" one of these authors?"
msgstr "Ar \"%(name)s\" yra vienas iš šių autorių?"
#: bookwyrm/templates/book/edit/edit_book.html:64
#, python-format
msgid "Author of <em>%(book_title)s</em>"
msgstr "<em>%(book_title)s</em> autorius"
#: bookwyrm/templates/book/edit/edit_book.html:67
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Author of "
msgstr "Autorius "
#: bookwyrm/templates/book/edit/edit_book.html:68
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Find more information at isni.org"
msgstr "Daugiau informacijos isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:79
msgid "This is a new author"
msgstr "Tai naujas autorius"
#: bookwyrm/templates/book/edit/edit_book.html:75
#: bookwyrm/templates/book/edit/edit_book.html:86
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Kuriamas naujas autorius: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:82
#: bookwyrm/templates/book/edit/edit_book.html:93
msgid "Is this an edition of an existing work?"
msgstr "Ar tai egzistuojančio darbo leidimas?"
#: bookwyrm/templates/book/edit/edit_book.html:90
#: bookwyrm/templates/book/edit/edit_book.html:101
msgid "This is a new work"
msgstr "Tai naujas darbas"
#: bookwyrm/templates/book/edit/edit_book.html:97
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/landing/password_reset.html:30
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
msgid "Confirm"
msgstr "Patvirtinti"
#: bookwyrm/templates/book/edit/edit_book.html:99
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/feed/status.html:9
msgid "Back"
msgstr "Atgal"
@ -591,7 +611,7 @@ msgstr "Kalbos:"
#: bookwyrm/templates/book/edit/edit_book_form.html:74
msgid "Publication"
msgstr "Paskelbimas"
msgstr "Leidimas"
#: bookwyrm/templates/book/edit/edit_book_form.html:77
msgid "Publisher:"
@ -930,7 +950,7 @@ msgstr "<a href=\"%(user_path)s\">%(username)s</a> įvertino <a href=\"%(book_pa
#: bookwyrm/templates/discover/card-header.html:27
#, python-format
msgid "<a href=\"%(user_path)s\">%(username)s</a> reviewed <a href=\"%(book_path)s\">%(book_title)s</a>"
msgstr "<a href=\"%(user_path)s\">%(username)s</a> peržiūrėjo <a href=\"%(book_path)s\">%(book_title)s</a>"
msgstr "<a href=\"%(user_path)s\">%(username)s</a> apžvelgė <a href=\"%(book_path)s\">%(book_title)s</a>"
#: bookwyrm/templates/discover/card-header.html:31
#, python-format
@ -1021,6 +1041,22 @@ msgstr "Esate pakviesti prisijungti prie %(site_name)s! Spauskite nuorodą žemi
msgid "Learn more about %(site_name)s:"
msgstr "Sužinoti daugiau apie %(site_name)s:"
#: bookwyrm/templates/email/moderation_report/html_content.html:6
#: bookwyrm/templates/email/moderation_report/text_content.html:5
#, python-format
msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
msgstr "@%(reporter)s pranešė apie netinkamą @%(reportee)s veiklą. "
#: bookwyrm/templates/email/moderation_report/html_content.html:9
#: bookwyrm/templates/email/moderation_report/text_content.html:7
msgid "View report"
msgstr "Peržiūrėti raportą"
#: bookwyrm/templates/email/moderation_report/subject.html:2
#, python-format
msgid "New report for %(site_name)s"
msgstr "Naujas %(site_name)s pranešimas"
#: bookwyrm/templates/email/password_reset/html_content.html:6
#: bookwyrm/templates/email/password_reset/text_content.html:4
#, python-format
@ -1063,15 +1099,31 @@ msgstr "Visos žinutės"
msgid "You have no messages right now."
msgstr "Neturite žinučių."
#: bookwyrm/templates/feed/feed.html:22
#: bookwyrm/templates/feed/feed.html:23
msgid "Feed settings"
msgstr "Srauto nustatymai"
#: bookwyrm/templates/feed/feed.html:26
msgid "Saved!"
msgstr "Išsaugota!"
#: bookwyrm/templates/feed/feed.html:47
msgid "Save settings"
msgstr "Išsaugoti nustatymus"
#: bookwyrm/templates/feed/feed.html:56
#, python-format
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr "įkelti <span data-poll=\"stream/%(tab_key)s\">0</span> neperskaitytų būsena"
#: bookwyrm/templates/feed/feed.html:38
#: bookwyrm/templates/feed/feed.html:72
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "Šiuo metu įrašų nėra. Norėdami matyti, sekite narį."
#: bookwyrm/templates/feed/feed.html:73
msgid "Alternatively, you can try enabling more status types"
msgstr "Taip pat galite pasirinkti daugiau būsenos tipų"
#: bookwyrm/templates/feed/goal_card.html:6
#: bookwyrm/templates/feed/layout.html:90
#: bookwyrm/templates/user/goal_form.html:6
@ -1114,7 +1166,7 @@ msgstr "Šiuo metu skaitoma"
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/books_header.html:8
msgid "Read"
msgstr "Perskaičiau"
msgstr "Perskaityta"
#: bookwyrm/templates/feed/suggested_users.html:5
#: bookwyrm/templates/get_started/users.html:6
@ -1483,7 +1535,7 @@ msgstr "Lentyna"
#: bookwyrm/templates/import/manual_review.html:13
#: bookwyrm/templates/snippets/create_status.html:17
msgid "Review"
msgstr "Peržiūra"
msgstr "Apžvalga"
#: bookwyrm/templates/import/import_status.html:119
msgid "Book"
@ -1513,7 +1565,7 @@ msgstr "Importuota"
#: bookwyrm/templates/import/import_status.html:182
msgid "Needs manual review"
msgstr "Reikalingas manualus atsiliepimas"
msgstr "Reikalinga peržvelgti"
#: bookwyrm/templates/import/import_status.html:195
msgid "Retry"
@ -2416,7 +2468,7 @@ msgstr[3] "%(display_count)s prašymai pakviesti"
#: bookwyrm/templates/settings/dashboard/dashboard.html:65
msgid "Instance Activity"
msgstr "Pavyzdinė veikla"
msgstr "Serverio statistika"
#: bookwyrm/templates/settings/dashboard/dashboard.html:83
msgid "Interval:"
@ -2436,7 +2488,7 @@ msgstr "Naudotojo prisijungimo veikla"
#: bookwyrm/templates/settings/dashboard/dashboard.html:112
msgid "Status activity"
msgstr "Būsenos veikla"
msgstr "Būsenos"
#: bookwyrm/templates/settings/dashboard/dashboard.html:118
msgid "Works created"
@ -3467,7 +3519,7 @@ msgstr "%(percent)s%% baigta!"
#: bookwyrm/templates/snippets/goal_progress.html:12
#, python-format
msgid "You've read <a href=\"%(path)s\">%(read_count)s of %(goal_count)s books</a>."
msgstr "Perskaitėte <a href=\"%(path)s\">%(read_count)s iš %(goal_count)s knygų</a>."
msgstr "Perskaityta <a href=\"%(path)s\">%(read_count)s iš %(goal_count)s knygų</a>."
#: bookwyrm/templates/snippets/goal_progress.html:14
#, python-format
@ -3504,7 +3556,7 @@ msgstr "Viešas"
#: bookwyrm/templates/snippets/privacy_select.html:14
#: bookwyrm/templates/snippets/privacy_select_no_followers.html:14
msgid "Unlisted"
msgstr "Nėra sąraše"
msgstr "Slaptas"
#: bookwyrm/templates/snippets/privacy-icons.html:12
msgid "Followers-only"
@ -3811,7 +3863,7 @@ msgstr "%(username)s neturi sekėjų"
#: bookwyrm/templates/user/relationships/following.html:6
#: bookwyrm/templates/user/relationships/layout.html:15
msgid "Following"
msgstr "Sekama"
msgstr "Sekami"
#: bookwyrm/templates/user/relationships/following.html:12
#, python-format
@ -3825,7 +3877,7 @@ msgstr "Redaguoti paskyrą"
#: bookwyrm/templates/user/user.html:33
#, python-format
msgid "View all %(size)s"
msgstr "Žiūrėti visus %(size)s"
msgstr "Žiūrėti visas %(size)s"
#: bookwyrm/templates/user/user.html:46
msgid "View all books"
@ -3873,13 +3925,13 @@ msgstr[3] "%(mutuals_display)s sekėjai, kuriuos sekate jūs"
#: bookwyrm/templates/user/user_preview.html:38
msgid "No followers you follow"
msgstr "Jūs nieko nesekate"
msgstr "Jūs kartu nieko nesekate"
#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28
msgid "File exceeds maximum size: 10MB"
msgstr "Failas viršijo maksimalų dydį: 10 MB"
#: bookwyrm/templatetags/utilities.py:31
#: bookwyrm/templatetags/utilities.py:34
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 18:03+0000\n"
"PO-Revision-Date: 2021-11-17 23:52\n"
"POT-Creation-Date: 2021-12-02 18:24+0000\n"
"PO-Revision-Date: 2021-12-02 21:40\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt\n"
@ -17,58 +17,58 @@ msgstr ""
"X-Crowdin-File: /[bookwyrm-social.bookwyrm] main/locale/en_US/LC_MESSAGES/django.po\n"
"X-Crowdin-File-ID: 1553\n"
#: bookwyrm/forms.py:248
#: bookwyrm/forms.py:262
msgid "A user with this email already exists."
msgstr "Já existe um usuário com este endereço de e-mail."
#: bookwyrm/forms.py:262
#: bookwyrm/forms.py:276
msgid "One Day"
msgstr "Um dia"
#: bookwyrm/forms.py:263
#: bookwyrm/forms.py:277
msgid "One Week"
msgstr "Uma semana"
#: bookwyrm/forms.py:264
#: bookwyrm/forms.py:278
msgid "One Month"
msgstr "Um mês"
#: bookwyrm/forms.py:265
#: bookwyrm/forms.py:279
msgid "Does Not Expire"
msgstr "Não expira"
#: bookwyrm/forms.py:269
#: bookwyrm/forms.py:283
#, python-brace-format
msgid "{i} uses"
msgstr "{i} usos"
#: bookwyrm/forms.py:270
#: bookwyrm/forms.py:284
msgid "Unlimited"
msgstr "Ilimitado"
#: bookwyrm/forms.py:338
#: bookwyrm/forms.py:352
msgid "List Order"
msgstr "Ordem de inserção"
#: bookwyrm/forms.py:339
#: bookwyrm/forms.py:353
msgid "Book Title"
msgstr "Título do livro"
#: bookwyrm/forms.py:340 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/forms.py:354 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/templates/shelf/shelf.html:181
#: bookwyrm/templates/snippets/create_status/review.html:33
msgid "Rating"
msgstr "Avaliação"
#: bookwyrm/forms.py:342 bookwyrm/templates/lists/list.html:110
#: bookwyrm/forms.py:356 bookwyrm/templates/lists/list.html:110
msgid "Sort By"
msgstr "Organizar por"
#: bookwyrm/forms.py:346
#: bookwyrm/forms.py:360
msgid "Ascending"
msgstr "Crescente"
#: bookwyrm/forms.py:347
#: bookwyrm/forms.py:361
msgid "Descending"
msgstr "Decrescente"
@ -152,6 +152,22 @@ msgstr "nome de usuário"
msgid "A user with that username already exists."
msgstr "Já existe um usuário com este nome."
#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "Resenhas"
#: bookwyrm/models/user.py:33
msgid "Comments"
msgstr "Comentários"
#: bookwyrm/models/user.py:34
msgid "Quotations"
msgstr "Citações"
#: bookwyrm/models/user.py:35
msgid "Everything else"
msgstr "Todo o resto"
#: bookwyrm/settings.py:118
msgid "Home Timeline"
msgstr "Linha do tempo"
@ -226,47 +242,51 @@ msgstr "Erro no servidor"
msgid "Something went wrong! Sorry about that."
msgstr "Algo deu errado! Foi mal."
#: bookwyrm/templates/author/author.html:17
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
msgstr "Editar autor"
#: bookwyrm/templates/author/author.html:34
#: bookwyrm/templates/author/author.html:35
#: bookwyrm/templates/author/edit_author.html:43
msgid "Aliases:"
msgstr "Pseudônimos:"
#: bookwyrm/templates/author/author.html:45
#: bookwyrm/templates/author/author.html:46
msgid "Born:"
msgstr "Nascimento:"
#: bookwyrm/templates/author/author.html:52
#: bookwyrm/templates/author/author.html:53
msgid "Died:"
msgstr "Morte:"
#: bookwyrm/templates/author/author.html:61
#: bookwyrm/templates/author/author.html:62
msgid "Wikipedia"
msgstr "Wikipédia"
#: bookwyrm/templates/author/author.html:69
#: bookwyrm/templates/author/author.html:70
msgid "View ISNI record"
msgstr "Ver registro ISNI"
#: bookwyrm/templates/author/author.html:78
#: bookwyrm/templates/book/book.html:94
msgid "View on OpenLibrary"
msgstr "Ver na OpenLibrary"
#: bookwyrm/templates/author/author.html:77
#: bookwyrm/templates/author/author.html:86
#: bookwyrm/templates/book/book.html:97
msgid "View on Inventaire"
msgstr "Ver no Inventaire"
#: bookwyrm/templates/author/author.html:85
#: bookwyrm/templates/author/author.html:94
msgid "View on LibraryThing"
msgstr "Ver no LibraryThing"
#: bookwyrm/templates/author/author.html:93
#: bookwyrm/templates/author/author.html:102
msgid "View on Goodreads"
msgstr "Ver no Goodreads"
#: bookwyrm/templates/author/author.html:108
#: bookwyrm/templates/author/author.html:117
#, python-format
msgid "Books by %(name)s"
msgstr "Livros de %(name)s"
@ -276,17 +296,17 @@ msgid "Edit Author:"
msgstr "Editar autor:"
#: bookwyrm/templates/author/edit_author.html:13
#: bookwyrm/templates/book/edit/edit_book.html:18
#: bookwyrm/templates/book/edit/edit_book.html:19
msgid "Added:"
msgstr "Adicionado:"
#: bookwyrm/templates/author/edit_author.html:14
#: bookwyrm/templates/book/edit/edit_book.html:21
#: bookwyrm/templates/book/edit/edit_book.html:22
msgid "Updated:"
msgstr "Atualizado:"
#: bookwyrm/templates/author/edit_author.html:16
#: bookwyrm/templates/book/edit/edit_book.html:25
#: bookwyrm/templates/book/edit/edit_book.html:26
msgid "Last edited by:"
msgstr "Editado pela última vez por:"
@ -346,7 +366,7 @@ msgstr "Chave Goodreads:"
#: bookwyrm/templates/author/edit_author.html:118
#: bookwyrm/templates/book/book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/book/edit/edit_book.html:121
#: bookwyrm/templates/book/readthrough.html:76
#: bookwyrm/templates/groups/form.html:24
#: bookwyrm/templates/lists/bookmark_button.html:15
@ -365,8 +385,8 @@ msgstr "Salvar"
#: bookwyrm/templates/author/edit_author.html:119
#: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190
#: bookwyrm/templates/book/cover_modal.html:32
#: bookwyrm/templates/book/edit/edit_book.html:112
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/readthrough.html:77
#: bookwyrm/templates/groups/delete_group_modal.html:17
#: bookwyrm/templates/lists/delete_list_modal.html:17
@ -444,10 +464,6 @@ msgstr "Criar"
msgid "You don't have any reading activity for this book."
msgstr "Você ainda não registrou seu progresso para este livro."
#: bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "Resenhas"
#: bookwyrm/templates/book/book.html:223
msgid "Your reviews"
msgstr "Suas resenhas"
@ -512,56 +528,60 @@ msgstr "Enviar capa:"
msgid "Load cover from url:"
msgstr "Carregar capa do endereço:"
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:11
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:12
#, python-format
msgid "Edit \"%(book_title)s\""
msgstr "Editar \"%(book_title)s\""
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:13
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:14
msgid "Add Book"
msgstr "Adicionar livro"
#: bookwyrm/templates/book/edit/edit_book.html:47
#: bookwyrm/templates/book/edit/edit_book.html:48
msgid "Confirm Book Info"
msgstr "Confirmar informações do livro"
#: bookwyrm/templates/book/edit/edit_book.html:55
#: bookwyrm/templates/book/edit/edit_book.html:56
#, python-format
msgid "Is \"%(name)s\" an existing author?"
msgstr "\"%(name)s\" é um autor já registrado?"
msgid "Is \"%(name)s\" one of these authors?"
msgstr "\"%(name)s\" é uma das pessoas citadas abaixo?"
#: bookwyrm/templates/book/edit/edit_book.html:64
#, python-format
msgid "Author of <em>%(book_title)s</em>"
msgstr "Autor de <em>%(book_title)s</em>"
#: bookwyrm/templates/book/edit/edit_book.html:67
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Author of "
msgstr "Autor de "
#: bookwyrm/templates/book/edit/edit_book.html:68
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Find more information at isni.org"
msgstr "Conheça mais em isni.org"
#: bookwyrm/templates/book/edit/edit_book.html:79
msgid "This is a new author"
msgstr "Novo autor"
#: bookwyrm/templates/book/edit/edit_book.html:75
#: bookwyrm/templates/book/edit/edit_book.html:86
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Criando um novo autor: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:82
#: bookwyrm/templates/book/edit/edit_book.html:93
msgid "Is this an edition of an existing work?"
msgstr "É uma edição de uma obra já registrada?"
#: bookwyrm/templates/book/edit/edit_book.html:90
#: bookwyrm/templates/book/edit/edit_book.html:101
msgid "This is a new work"
msgstr "É uma nova obra"
#: bookwyrm/templates/book/edit/edit_book.html:97
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/landing/password_reset.html:30
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
msgid "Confirm"
msgstr "Confirmar"
#: bookwyrm/templates/book/edit/edit_book.html:99
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/feed/status.html:9
msgid "Back"
msgstr "Voltar"
@ -1015,6 +1035,22 @@ msgstr "Você recebeu um convite para juntar-se a %(site_name)s! Clique no link
msgid "Learn more about %(site_name)s:"
msgstr "Saiba mais sobre %(site_name)s:"
#: bookwyrm/templates/email/moderation_report/html_content.html:6
#: bookwyrm/templates/email/moderation_report/text_content.html:5
#, python-format
msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
msgstr "@%(reporter)s sinalizou o comportamento de @%(reportee)s para moderação. "
#: bookwyrm/templates/email/moderation_report/html_content.html:9
#: bookwyrm/templates/email/moderation_report/text_content.html:7
msgid "View report"
msgstr "Ver denúncia"
#: bookwyrm/templates/email/moderation_report/subject.html:2
#, python-format
msgid "New report for %(site_name)s"
msgstr "Nova denúncia em %(site_name)s"
#: bookwyrm/templates/email/password_reset/html_content.html:6
#: bookwyrm/templates/email/password_reset/text_content.html:4
#, python-format
@ -1057,15 +1093,31 @@ msgstr "Todas as mensagens"
msgid "You have no messages right now."
msgstr "Você não tem mensagens."
#: bookwyrm/templates/feed/feed.html:22
#: bookwyrm/templates/feed/feed.html:23
msgid "Feed settings"
msgstr "Configurações das atualizações"
#: bookwyrm/templates/feed/feed.html:26
msgid "Saved!"
msgstr "Salvo!"
#: bookwyrm/templates/feed/feed.html:47
msgid "Save settings"
msgstr "Salvar configurações"
#: bookwyrm/templates/feed/feed.html:56
#, python-format
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr "carregar <span data-poll=\"stream/%(tab_key)s\">0</span> publicações não lida(s)"
#: bookwyrm/templates/feed/feed.html:38
#: bookwyrm/templates/feed/feed.html:72
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "Não há nenhuma atividade! Tente seguir um usuário para começar"
#: bookwyrm/templates/feed/feed.html:73
msgid "Alternatively, you can try enabling more status types"
msgstr "Uma outra opção é habilitar mais tipos de publicação"
#: bookwyrm/templates/feed/goal_card.html:6
#: bookwyrm/templates/feed/layout.html:90
#: bookwyrm/templates/user/goal_form.html:6
@ -3841,7 +3893,7 @@ msgstr "Nenhum seguidor que você segue"
msgid "File exceeds maximum size: 10MB"
msgstr "Arquivo excede o tamanho máximo: 10MB"
#: bookwyrm/templatetags/utilities.py:31
#: bookwyrm/templatetags/utilities.py:34
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 18:03+0000\n"
"PO-Revision-Date: 2021-11-17 18:42\n"
"POT-Creation-Date: 2021-12-02 18:24+0000\n"
"PO-Revision-Date: 2021-12-02 21:41\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Chinese Simplified\n"
"Language: zh\n"
@ -17,58 +17,58 @@ msgstr ""
"X-Crowdin-File: /[bookwyrm-social.bookwyrm] main/locale/en_US/LC_MESSAGES/django.po\n"
"X-Crowdin-File-ID: 1553\n"
#: bookwyrm/forms.py:248
#: bookwyrm/forms.py:262
msgid "A user with this email already exists."
msgstr "已经存在使用该邮箱的用户。"
#: bookwyrm/forms.py:262
#: bookwyrm/forms.py:276
msgid "One Day"
msgstr "一天"
#: bookwyrm/forms.py:263
#: bookwyrm/forms.py:277
msgid "One Week"
msgstr "一周"
#: bookwyrm/forms.py:264
#: bookwyrm/forms.py:278
msgid "One Month"
msgstr "一个月"
#: bookwyrm/forms.py:265
#: bookwyrm/forms.py:279
msgid "Does Not Expire"
msgstr "永不失效"
#: bookwyrm/forms.py:269
#: bookwyrm/forms.py:283
#, python-brace-format
msgid "{i} uses"
msgstr "{i} 次使用"
#: bookwyrm/forms.py:270
#: bookwyrm/forms.py:284
msgid "Unlimited"
msgstr "不受限"
#: bookwyrm/forms.py:338
#: bookwyrm/forms.py:352
msgid "List Order"
msgstr "列表顺序"
#: bookwyrm/forms.py:339
#: bookwyrm/forms.py:353
msgid "Book Title"
msgstr "书名"
#: bookwyrm/forms.py:340 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/forms.py:354 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/templates/shelf/shelf.html:181
#: bookwyrm/templates/snippets/create_status/review.html:33
msgid "Rating"
msgstr "评价"
#: bookwyrm/forms.py:342 bookwyrm/templates/lists/list.html:110
#: bookwyrm/forms.py:356 bookwyrm/templates/lists/list.html:110
msgid "Sort By"
msgstr "排序方式"
#: bookwyrm/forms.py:346
#: bookwyrm/forms.py:360
msgid "Ascending"
msgstr "升序"
#: bookwyrm/forms.py:347
#: bookwyrm/forms.py:361
msgid "Descending"
msgstr "降序"
@ -152,6 +152,22 @@ msgstr "用户名"
msgid "A user with that username already exists."
msgstr "已经存在使用该用户名的用户。"
#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "书评"
#: bookwyrm/models/user.py:33
msgid "Comments"
msgstr ""
#: bookwyrm/models/user.py:34
msgid "Quotations"
msgstr ""
#: bookwyrm/models/user.py:35
msgid "Everything else"
msgstr ""
#: bookwyrm/settings.py:118
msgid "Home Timeline"
msgstr "主页时间线"
@ -184,7 +200,7 @@ msgstr "Español西班牙语"
#: bookwyrm/settings.py:168
msgid "Galego (Galician)"
msgstr ""
msgstr "Galego加利西亚语"
#: bookwyrm/settings.py:169
msgid "Français (French)"
@ -192,11 +208,11 @@ msgstr "Français法语"
#: bookwyrm/settings.py:170
msgid "Lietuvių (Lithuanian)"
msgstr ""
msgstr "Lietuvių立陶宛语"
#: bookwyrm/settings.py:171
msgid "Português - Brasil (Brazilian Portuguese)"
msgstr "葡萄牙语-巴西(巴西的葡语)"
msgstr "Português - Brasil巴西葡萄牙语)"
#: bookwyrm/settings.py:172
msgid "简体中文 (Simplified Chinese)"
@ -226,47 +242,51 @@ msgstr "服务器错误"
msgid "Something went wrong! Sorry about that."
msgstr "某些东西出错了!对不起啦。"
#: bookwyrm/templates/author/author.html:17
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
msgstr "编辑作者"
#: bookwyrm/templates/author/author.html:34
#: bookwyrm/templates/author/author.html:35
#: bookwyrm/templates/author/edit_author.html:43
msgid "Aliases:"
msgstr "别名:"
#: bookwyrm/templates/author/author.html:45
#: bookwyrm/templates/author/author.html:46
msgid "Born:"
msgstr "出生:"
#: bookwyrm/templates/author/author.html:52
#: bookwyrm/templates/author/author.html:53
msgid "Died:"
msgstr "逝世:"
#: bookwyrm/templates/author/author.html:61
#: bookwyrm/templates/author/author.html:62
msgid "Wikipedia"
msgstr "维基百科"
#: bookwyrm/templates/author/author.html:69
#: bookwyrm/templates/author/author.html:70
msgid "View ISNI record"
msgstr ""
#: bookwyrm/templates/author/author.html:78
#: bookwyrm/templates/book/book.html:94
msgid "View on OpenLibrary"
msgstr "在 OpenLibrary 查看"
#: bookwyrm/templates/author/author.html:77
#: bookwyrm/templates/author/author.html:86
#: bookwyrm/templates/book/book.html:97
msgid "View on Inventaire"
msgstr "在 Inventaire 查看"
#: bookwyrm/templates/author/author.html:85
#: bookwyrm/templates/author/author.html:94
msgid "View on LibraryThing"
msgstr "在 LibraryThing 查看"
#: bookwyrm/templates/author/author.html:93
#: bookwyrm/templates/author/author.html:102
msgid "View on Goodreads"
msgstr "在 Goodreads 查看"
#: bookwyrm/templates/author/author.html:108
#: bookwyrm/templates/author/author.html:117
#, python-format
msgid "Books by %(name)s"
msgstr "%(name)s 所著的书"
@ -276,17 +296,17 @@ msgid "Edit Author:"
msgstr "编辑作者:"
#: bookwyrm/templates/author/edit_author.html:13
#: bookwyrm/templates/book/edit/edit_book.html:18
#: bookwyrm/templates/book/edit/edit_book.html:19
msgid "Added:"
msgstr "添加了:"
#: bookwyrm/templates/author/edit_author.html:14
#: bookwyrm/templates/book/edit/edit_book.html:21
#: bookwyrm/templates/book/edit/edit_book.html:22
msgid "Updated:"
msgstr "更新了:"
#: bookwyrm/templates/author/edit_author.html:16
#: bookwyrm/templates/book/edit/edit_book.html:25
#: bookwyrm/templates/book/edit/edit_book.html:26
msgid "Last edited by:"
msgstr "最后编辑人:"
@ -346,7 +366,7 @@ msgstr "Goodreads key:"
#: bookwyrm/templates/author/edit_author.html:118
#: bookwyrm/templates/book/book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/book/edit/edit_book.html:121
#: bookwyrm/templates/book/readthrough.html:76
#: bookwyrm/templates/groups/form.html:24
#: bookwyrm/templates/lists/bookmark_button.html:15
@ -365,8 +385,8 @@ msgstr "保存"
#: bookwyrm/templates/author/edit_author.html:119
#: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190
#: bookwyrm/templates/book/cover_modal.html:32
#: bookwyrm/templates/book/edit/edit_book.html:112
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/readthrough.html:77
#: bookwyrm/templates/groups/delete_group_modal.html:17
#: bookwyrm/templates/lists/delete_list_modal.html:17
@ -443,10 +463,6 @@ msgstr "创建"
msgid "You don't have any reading activity for this book."
msgstr "你还没有任何这本书的阅读活动。"
#: bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "书评"
#: bookwyrm/templates/book/book.html:223
msgid "Your reviews"
msgstr "你的书评"
@ -511,56 +527,60 @@ msgstr "上传封面:"
msgid "Load cover from url:"
msgstr "从网址加载封面:"
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:11
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:12
#, python-format
msgid "Edit \"%(book_title)s\""
msgstr "编辑《%(book_title)s》"
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:13
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:14
msgid "Add Book"
msgstr "添加书目"
#: bookwyrm/templates/book/edit/edit_book.html:47
#: bookwyrm/templates/book/edit/edit_book.html:48
msgid "Confirm Book Info"
msgstr "确认书目信息"
#: bookwyrm/templates/book/edit/edit_book.html:55
#: bookwyrm/templates/book/edit/edit_book.html:56
#, python-format
msgid "Is \"%(name)s\" an existing author?"
msgstr "“%(name)s” 是已存在的作者吗?"
msgid "Is \"%(name)s\" one of these authors?"
msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:64
#, python-format
msgid "Author of <em>%(book_title)s</em>"
msgstr "<em>%(book_title)s</em> 的作者"
#: bookwyrm/templates/book/edit/edit_book.html:67
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Author of "
msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:68
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Find more information at isni.org"
msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:79
msgid "This is a new author"
msgstr "这是一位新的作者"
#: bookwyrm/templates/book/edit/edit_book.html:75
#: bookwyrm/templates/book/edit/edit_book.html:86
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "正在创建新的作者: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:82
#: bookwyrm/templates/book/edit/edit_book.html:93
msgid "Is this an edition of an existing work?"
msgstr "这是已存在的作品的一个版本吗?"
#: bookwyrm/templates/book/edit/edit_book.html:90
#: bookwyrm/templates/book/edit/edit_book.html:101
msgid "This is a new work"
msgstr "这是一个新的作品。"
#: bookwyrm/templates/book/edit/edit_book.html:97
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/landing/password_reset.html:30
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
msgid "Confirm"
msgstr "确认"
#: bookwyrm/templates/book/edit/edit_book.html:99
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/feed/status.html:9
msgid "Back"
msgstr "返回"
@ -906,12 +926,12 @@ msgstr "<a href=\"%(user_path)s\">%(username)s</a> 想要阅读 <a href=\"%(book
#: bookwyrm/templates/discover/card-header.html:13
#, python-format
msgid "<a href=\"%(user_path)s\">%(username)s</a> finished reading <a href=\"%(book_path)s\">%(book_title)s</a>"
msgstr ""
msgstr "<a href=\"%(user_path)s\">%(username)s</a> 完成了 <a href=\"%(book_path)s\">%(book_title)s</a> 的阅读"
#: bookwyrm/templates/discover/card-header.html:18
#, python-format
msgid "<a href=\"%(user_path)s\">%(username)s</a> started reading <a href=\"%(book_path)s\">%(book_title)s</a>"
msgstr ""
msgstr "<a href=\"%(user_path)s\">%(username)s</a> 开始阅读 <a href=\"%(book_path)s\">%(book_title)s</a>"
#: bookwyrm/templates/discover/card-header.html:23
#, python-format
@ -1012,6 +1032,22 @@ msgstr "你受邀请加入 %(site_name)s点击下面的连接来创建帐号
msgid "Learn more about %(site_name)s:"
msgstr "进一步了解 %(site_name)s"
#: bookwyrm/templates/email/moderation_report/html_content.html:6
#: bookwyrm/templates/email/moderation_report/text_content.html:5
#, python-format
msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
msgstr ""
#: bookwyrm/templates/email/moderation_report/html_content.html:9
#: bookwyrm/templates/email/moderation_report/text_content.html:7
msgid "View report"
msgstr ""
#: bookwyrm/templates/email/moderation_report/subject.html:2
#, python-format
msgid "New report for %(site_name)s"
msgstr ""
#: bookwyrm/templates/email/password_reset/html_content.html:6
#: bookwyrm/templates/email/password_reset/text_content.html:4
#, python-format
@ -1054,15 +1090,31 @@ msgstr "所有消息"
msgid "You have no messages right now."
msgstr "你现在没有消息。"
#: bookwyrm/templates/feed/feed.html:22
#: bookwyrm/templates/feed/feed.html:23
msgid "Feed settings"
msgstr ""
#: bookwyrm/templates/feed/feed.html:26
msgid "Saved!"
msgstr ""
#: bookwyrm/templates/feed/feed.html:47
msgid "Save settings"
msgstr ""
#: bookwyrm/templates/feed/feed.html:56
#, python-format
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr "加载 <span data-poll=\"stream/%(tab_key)s\">0</span> 条未读状态"
#: bookwyrm/templates/feed/feed.html:38
#: bookwyrm/templates/feed/feed.html:72
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "现在还没有任何活动!尝试从关注一个用户开始吧"
#: bookwyrm/templates/feed/feed.html:73
msgid "Alternatively, you can try enabling more status types"
msgstr ""
#: bookwyrm/templates/feed/goal_card.html:6
#: bookwyrm/templates/feed/layout.html:90
#: bookwyrm/templates/user/goal_form.html:6
@ -1395,11 +1447,11 @@ msgstr "导入状态"
#: bookwyrm/templates/import/import_status.html:13
#: bookwyrm/templates/import/import_status.html:27
msgid "Retry Status"
msgstr ""
msgstr "重试状态"
#: bookwyrm/templates/import/import_status.html:22
msgid "Imports"
msgstr ""
msgstr "导入"
#: bookwyrm/templates/import/import_status.html:39
msgid "Import started:"
@ -1407,36 +1459,36 @@ msgstr "导入开始:"
#: bookwyrm/templates/import/import_status.html:48
msgid "In progress"
msgstr ""
msgstr "正在进行"
#: bookwyrm/templates/import/import_status.html:50
msgid "Refresh"
msgstr ""
msgstr "刷新"
#: bookwyrm/templates/import/import_status.html:71
#, python-format
msgid "%(display_counter)s item needs manual approval."
msgid_plural "%(display_counter)s items need manual approval."
msgstr[0] ""
msgstr[0] "%(display_counter)s 项需要手动批准。"
#: bookwyrm/templates/import/import_status.html:76
#: bookwyrm/templates/import/manual_review.html:8
msgid "Review items"
msgstr ""
msgstr "审阅项目"
#: bookwyrm/templates/import/import_status.html:82
#, python-format
msgid "%(display_counter)s item failed to import."
msgid_plural "%(display_counter)s items failed to import."
msgstr[0] ""
msgstr[0] "%(display_counter)s 项导入失败。"
#: bookwyrm/templates/import/import_status.html:88
msgid "View and troubleshoot failed items"
msgstr ""
msgstr "查看并排查失败项目"
#: bookwyrm/templates/import/import_status.html:100
msgid "Row"
msgstr ""
msgstr ""
#: bookwyrm/templates/import/import_status.html:103
#: bookwyrm/templates/shelf/shelf.html:141
@ -1446,7 +1498,7 @@ msgstr "标题"
#: bookwyrm/templates/import/import_status.html:106
msgid "ISBN"
msgstr ""
msgstr "ISBN"
#: bookwyrm/templates/import/import_status.html:109
#: bookwyrm/templates/shelf/shelf.html:142
@ -1456,7 +1508,7 @@ msgstr "作者"
#: bookwyrm/templates/import/import_status.html:112
msgid "Shelf"
msgstr ""
msgstr "书架"
#: bookwyrm/templates/import/import_status.html:115
#: bookwyrm/templates/import/manual_review.html:13
@ -1480,11 +1532,11 @@ msgstr "状态"
#: bookwyrm/templates/import/import_status.html:130
msgid "Import preview unavailable."
msgstr ""
msgstr "导入预览不可用。"
#: bookwyrm/templates/import/import_status.html:162
msgid "View imported review"
msgstr ""
msgstr "查看已导入的书评"
#: bookwyrm/templates/import/import_status.html:176
msgid "Imported"
@ -1492,28 +1544,28 @@ msgstr "已导入"
#: bookwyrm/templates/import/import_status.html:182
msgid "Needs manual review"
msgstr ""
msgstr "需要手动批准"
#: bookwyrm/templates/import/import_status.html:195
msgid "Retry"
msgstr ""
msgstr "重试"
#: bookwyrm/templates/import/import_status.html:213
msgid "This import is in an old format that is no longer supported. If you would like to troubleshoot missing items from this import, click the button below to update the import format."
msgstr ""
msgstr "此导入所用格式已不再受支持。 如果您想要在此次导入中排查缺失的项目,请点击下面的按钮来更新导入格式。"
#: bookwyrm/templates/import/import_status.html:215
msgid "Update import"
msgstr ""
msgstr "更新导入"
#: bookwyrm/templates/import/manual_review.html:5
#: bookwyrm/templates/import/troubleshoot.html:4
msgid "Import Troubleshooting"
msgstr ""
msgstr "导入排查"
#: bookwyrm/templates/import/manual_review.html:21
msgid "Approving a suggestion will permanently add the suggested book to your shelves and associate your reading dates, reviews, and ratings with that book."
msgstr ""
msgstr "批准建议后,被提议的书将会永久添加到您的书架上并与您的阅读日期、书评、评分联系起来。"
#: bookwyrm/templates/import/manual_review.html:58
#: bookwyrm/templates/lists/curate.html:57
@ -1522,7 +1574,7 @@ msgstr "批准"
#: bookwyrm/templates/import/manual_review.html:66
msgid "Reject"
msgstr ""
msgstr "驳回"
#: bookwyrm/templates/import/tooltip.html:6
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener\">Import/Export page</a> of your Goodreads account."
@ -1530,31 +1582,31 @@ msgstr "您可以从 <a href=\"https://www.goodreads.com/review/import\" target=
#: bookwyrm/templates/import/troubleshoot.html:7
msgid "Failed items"
msgstr ""
msgstr "失败项目"
#: bookwyrm/templates/import/troubleshoot.html:12
msgid "Troubleshooting"
msgstr ""
msgstr "问题排查"
#: bookwyrm/templates/import/troubleshoot.html:20
msgid "Re-trying an import can fix missing items in cases such as:"
msgstr ""
msgstr "重试导入可以修复以下情况的缺失项目:"
#: bookwyrm/templates/import/troubleshoot.html:23
msgid "The book has been added to the instance since this import"
msgstr ""
msgstr "在此次导入后该书已被添加到本实例"
#: bookwyrm/templates/import/troubleshoot.html:24
msgid "A transient error or timeout caused the external data source to be unavailable."
msgstr ""
msgstr "暂时的错误或超时导致外部数据源不可用。"
#: bookwyrm/templates/import/troubleshoot.html:25
msgid "BookWyrm has been updated since this import with a bug fix"
msgstr ""
msgstr "在此次导入后BookWyrm 已经更新并修复了漏洞"
#: bookwyrm/templates/import/troubleshoot.html:28
msgid "Contact your admin or <a href='https://github.com/bookwyrm-social/bookwyrm/issues'>open an issue</a> if you are seeing unexpected failed items."
msgstr ""
msgstr "如果您看到意外失败的项目,请联系您的管理员或 <a href='https://github.com/bookwyrm-social/bookwyrm/issues'>发起一个 issue</a>。"
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230
#, python-format
@ -3822,7 +3874,7 @@ msgstr "没有你关注的关注者"
msgid "File exceeds maximum size: 10MB"
msgstr "文件超过了最大大小: 10MB"
#: bookwyrm/templatetags/utilities.py:31
#: bookwyrm/templatetags/utilities.py:34
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s%(subtitle)s"

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-17 18:03+0000\n"
"PO-Revision-Date: 2021-11-17 18:41\n"
"POT-Creation-Date: 2021-12-02 18:24+0000\n"
"PO-Revision-Date: 2021-12-02 21:41\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Chinese Traditional\n"
"Language: zh\n"
@ -17,58 +17,58 @@ msgstr ""
"X-Crowdin-File: /[bookwyrm-social.bookwyrm] main/locale/en_US/LC_MESSAGES/django.po\n"
"X-Crowdin-File-ID: 1553\n"
#: bookwyrm/forms.py:248
#: bookwyrm/forms.py:262
msgid "A user with this email already exists."
msgstr "已經存在使用該郵箱的使用者。"
#: bookwyrm/forms.py:262
#: bookwyrm/forms.py:276
msgid "One Day"
msgstr "一天"
#: bookwyrm/forms.py:263
#: bookwyrm/forms.py:277
msgid "One Week"
msgstr "一週"
#: bookwyrm/forms.py:264
#: bookwyrm/forms.py:278
msgid "One Month"
msgstr "一個月"
#: bookwyrm/forms.py:265
#: bookwyrm/forms.py:279
msgid "Does Not Expire"
msgstr "永不失效"
#: bookwyrm/forms.py:269
#: bookwyrm/forms.py:283
#, python-brace-format
msgid "{i} uses"
msgstr ""
#: bookwyrm/forms.py:270
#: bookwyrm/forms.py:284
msgid "Unlimited"
msgstr "不受限"
#: bookwyrm/forms.py:338
#: bookwyrm/forms.py:352
msgid "List Order"
msgstr "列表順序"
#: bookwyrm/forms.py:339
#: bookwyrm/forms.py:353
msgid "Book Title"
msgstr "書名"
#: bookwyrm/forms.py:340 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/forms.py:354 bookwyrm/templates/shelf/shelf.html:149
#: bookwyrm/templates/shelf/shelf.html:181
#: bookwyrm/templates/snippets/create_status/review.html:33
msgid "Rating"
msgstr "評價"
#: bookwyrm/forms.py:342 bookwyrm/templates/lists/list.html:110
#: bookwyrm/forms.py:356 bookwyrm/templates/lists/list.html:110
msgid "Sort By"
msgstr "排序方式"
#: bookwyrm/forms.py:346
#: bookwyrm/forms.py:360
msgid "Ascending"
msgstr "升序"
#: bookwyrm/forms.py:347
#: bookwyrm/forms.py:361
msgid "Descending"
msgstr "降序"
@ -152,6 +152,22 @@ msgstr "使用者名稱"
msgid "A user with that username already exists."
msgstr "已經存在使用該名稱的使用者。"
#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "書評"
#: bookwyrm/models/user.py:33
msgid "Comments"
msgstr ""
#: bookwyrm/models/user.py:34
msgid "Quotations"
msgstr ""
#: bookwyrm/models/user.py:35
msgid "Everything else"
msgstr ""
#: bookwyrm/settings.py:118
msgid "Home Timeline"
msgstr "主頁時間線"
@ -226,47 +242,51 @@ msgstr "伺服器錯誤"
msgid "Something went wrong! Sorry about that."
msgstr "某些東西出錯了!抱歉。"
#: bookwyrm/templates/author/author.html:17
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
msgstr "編輯作者"
#: bookwyrm/templates/author/author.html:34
#: bookwyrm/templates/author/author.html:35
#: bookwyrm/templates/author/edit_author.html:43
msgid "Aliases:"
msgstr "別名:"
#: bookwyrm/templates/author/author.html:45
#: bookwyrm/templates/author/author.html:46
msgid "Born:"
msgstr "出生:"
#: bookwyrm/templates/author/author.html:52
#: bookwyrm/templates/author/author.html:53
msgid "Died:"
msgstr "逝世:"
#: bookwyrm/templates/author/author.html:61
#: bookwyrm/templates/author/author.html:62
msgid "Wikipedia"
msgstr "維基百科"
#: bookwyrm/templates/author/author.html:69
#: bookwyrm/templates/author/author.html:70
msgid "View ISNI record"
msgstr ""
#: bookwyrm/templates/author/author.html:78
#: bookwyrm/templates/book/book.html:94
msgid "View on OpenLibrary"
msgstr "在 OpenLibrary 檢視"
#: bookwyrm/templates/author/author.html:77
#: bookwyrm/templates/author/author.html:86
#: bookwyrm/templates/book/book.html:97
msgid "View on Inventaire"
msgstr "在 Inventaire 檢視"
#: bookwyrm/templates/author/author.html:85
#: bookwyrm/templates/author/author.html:94
msgid "View on LibraryThing"
msgstr ""
#: bookwyrm/templates/author/author.html:93
#: bookwyrm/templates/author/author.html:102
msgid "View on Goodreads"
msgstr ""
#: bookwyrm/templates/author/author.html:108
#: bookwyrm/templates/author/author.html:117
#, python-format
msgid "Books by %(name)s"
msgstr "%(name)s 所著的書"
@ -276,17 +296,17 @@ msgid "Edit Author:"
msgstr "編輯作者:"
#: bookwyrm/templates/author/edit_author.html:13
#: bookwyrm/templates/book/edit/edit_book.html:18
#: bookwyrm/templates/book/edit/edit_book.html:19
msgid "Added:"
msgstr "新增了:"
#: bookwyrm/templates/author/edit_author.html:14
#: bookwyrm/templates/book/edit/edit_book.html:21
#: bookwyrm/templates/book/edit/edit_book.html:22
msgid "Updated:"
msgstr "更新了:"
#: bookwyrm/templates/author/edit_author.html:16
#: bookwyrm/templates/book/edit/edit_book.html:25
#: bookwyrm/templates/book/edit/edit_book.html:26
msgid "Last edited by:"
msgstr "最後編輯者:"
@ -346,7 +366,7 @@ msgstr "Goodreads key:"
#: bookwyrm/templates/author/edit_author.html:118
#: bookwyrm/templates/book/book.html:140
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/book/edit/edit_book.html:121
#: bookwyrm/templates/book/readthrough.html:76
#: bookwyrm/templates/groups/form.html:24
#: bookwyrm/templates/lists/bookmark_button.html:15
@ -365,8 +385,8 @@ msgstr "儲存"
#: bookwyrm/templates/author/edit_author.html:119
#: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190
#: bookwyrm/templates/book/cover_modal.html:32
#: bookwyrm/templates/book/edit/edit_book.html:112
#: bookwyrm/templates/book/edit/edit_book.html:115
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/readthrough.html:77
#: bookwyrm/templates/groups/delete_group_modal.html:17
#: bookwyrm/templates/lists/delete_list_modal.html:17
@ -443,10 +463,6 @@ msgstr "建立"
msgid "You don't have any reading activity for this book."
msgstr "你還未閱讀這本書。"
#: bookwyrm/templates/book/book.html:218
msgid "Reviews"
msgstr "書評"
#: bookwyrm/templates/book/book.html:223
msgid "Your reviews"
msgstr "你的書評"
@ -511,56 +527,60 @@ msgstr "上載封面:"
msgid "Load cover from url:"
msgstr "從網址載入封面:"
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:11
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:12
#, python-format
msgid "Edit \"%(book_title)s\""
msgstr "編輯 \"%(book_title)s\""
#: bookwyrm/templates/book/edit/edit_book.html:5
#: bookwyrm/templates/book/edit/edit_book.html:13
#: bookwyrm/templates/book/edit/edit_book.html:6
#: bookwyrm/templates/book/edit/edit_book.html:14
msgid "Add Book"
msgstr "新增書目"
#: bookwyrm/templates/book/edit/edit_book.html:47
#: bookwyrm/templates/book/edit/edit_book.html:48
msgid "Confirm Book Info"
msgstr "確認書目資料"
#: bookwyrm/templates/book/edit/edit_book.html:55
#: bookwyrm/templates/book/edit/edit_book.html:56
#, python-format
msgid "Is \"%(name)s\" an existing author?"
msgstr "\"%(name)s\" 是已存在的作者嗎?"
msgid "Is \"%(name)s\" one of these authors?"
msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:64
#, python-format
msgid "Author of <em>%(book_title)s</em>"
msgstr "<em>%(book_title)s</em> 的作者"
#: bookwyrm/templates/book/edit/edit_book.html:67
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Author of "
msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:68
#: bookwyrm/templates/book/edit/edit_book.html:69
msgid "Find more information at isni.org"
msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:79
msgid "This is a new author"
msgstr "這是一位新的作者"
#: bookwyrm/templates/book/edit/edit_book.html:75
#: bookwyrm/templates/book/edit/edit_book.html:86
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "正在建立新的作者: %(name)s"
#: bookwyrm/templates/book/edit/edit_book.html:82
#: bookwyrm/templates/book/edit/edit_book.html:93
msgid "Is this an edition of an existing work?"
msgstr "這是已存在的作品的另一個版本嗎?"
#: bookwyrm/templates/book/edit/edit_book.html:90
#: bookwyrm/templates/book/edit/edit_book.html:101
msgid "This is a new work"
msgstr "這是一個新的作品。"
#: bookwyrm/templates/book/edit/edit_book.html:97
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/landing/password_reset.html:30
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
msgid "Confirm"
msgstr "確認"
#: bookwyrm/templates/book/edit/edit_book.html:99
#: bookwyrm/templates/book/edit/edit_book.html:110
#: bookwyrm/templates/feed/status.html:9
msgid "Back"
msgstr "返回"
@ -1012,6 +1032,22 @@ msgstr "你受邀請加入 %(site_name)s點選下面的連結來建立帳號
msgid "Learn more about %(site_name)s:"
msgstr ""
#: bookwyrm/templates/email/moderation_report/html_content.html:6
#: bookwyrm/templates/email/moderation_report/text_content.html:5
#, python-format
msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
msgstr ""
#: bookwyrm/templates/email/moderation_report/html_content.html:9
#: bookwyrm/templates/email/moderation_report/text_content.html:7
msgid "View report"
msgstr ""
#: bookwyrm/templates/email/moderation_report/subject.html:2
#, python-format
msgid "New report for %(site_name)s"
msgstr ""
#: bookwyrm/templates/email/password_reset/html_content.html:6
#: bookwyrm/templates/email/password_reset/text_content.html:4
#, python-format
@ -1054,15 +1090,31 @@ msgstr "所有訊息"
msgid "You have no messages right now."
msgstr "你現在沒有訊息。"
#: bookwyrm/templates/feed/feed.html:22
#: bookwyrm/templates/feed/feed.html:23
msgid "Feed settings"
msgstr ""
#: bookwyrm/templates/feed/feed.html:26
msgid "Saved!"
msgstr ""
#: bookwyrm/templates/feed/feed.html:47
msgid "Save settings"
msgstr ""
#: bookwyrm/templates/feed/feed.html:56
#, python-format
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr ""
#: bookwyrm/templates/feed/feed.html:38
#: bookwyrm/templates/feed/feed.html:72
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "現在還沒有任何活動!嘗試著從關注一個使用者開始吧"
#: bookwyrm/templates/feed/feed.html:73
msgid "Alternatively, you can try enabling more status types"
msgstr ""
#: bookwyrm/templates/feed/goal_card.html:6
#: bookwyrm/templates/feed/layout.html:90
#: bookwyrm/templates/user/goal_form.html:6
@ -3822,7 +3874,7 @@ msgstr ""
msgid "File exceeds maximum size: 10MB"
msgstr "檔案超過了最大大小: 10MB"
#: bookwyrm/templatetags/utilities.py:31
#: bookwyrm/templatetags/utilities.py:34
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr ""