Merge branch 'main' into debug-toolbar

This commit is contained in:
Mouse Reeve 2022-01-27 18:56:36 -08:00
commit ff4cab4dd4
72 changed files with 7342 additions and 1997 deletions

View file

@ -8,6 +8,8 @@ USE_HTTPS=true
DOMAIN=your.domain.here
EMAIL=your@email.here
# Instance defualt language (see options at bookwyrm/settings.py "LANGUAGES"
LANGUAGE_CODE="en-us"
# Used for deciding which editions to prefer
DEFAULT_LANGUAGE="English"

View file

@ -444,6 +444,12 @@ class ListForm(CustomForm):
fields = ["user", "name", "description", "curation", "privacy", "group"]
class ListItemForm(CustomForm):
class Meta:
model = models.ListItem
fields = ["user", "book", "book_list", "notes"]
class GroupForm(CustomForm):
class Meta:
model = models.Group

View file

@ -19,9 +19,7 @@ def init_permissions():
{
"codename": "edit_instance_settings",
"name": "change the instance info",
"groups": [
"admin",
],
"groups": ["admin"],
},
{
"codename": "set_user_group",
@ -55,7 +53,7 @@ def init_permissions():
},
]
content_type = models.ContentType.objects.get_for_model(User)
content_type = ContentType.objects.get_for_model(models.User)
for permission in permissions:
permission_obj = Permission.objects.create(
codename=permission["codename"],
@ -66,15 +64,12 @@ def init_permissions():
for group_name in permission["groups"]:
Group.objects.get(name=group_name).permissions.add(permission_obj)
# while the groups and permissions shouldn't be changed because the code
# depends on them, what permissions go with what groups should be editable
def init_connectors():
"""access book data sources"""
models.Connector.objects.create(
identifier="bookwyrm.social",
name="BookWyrm dot Social",
name="Bookwyrm.social",
connector_file="bookwyrm_connector",
base_url="https://bookwyrm.social",
books_url="https://bookwyrm.social/book",
@ -84,6 +79,7 @@ def init_connectors():
priority=2,
)
# pylint: disable=line-too-long
models.Connector.objects.create(
identifier="inventaire.io",
name="Inventaire",
@ -127,7 +123,7 @@ def init_settings():
)
def init_link_domains(*_):
def init_link_domains():
"""safe book links"""
domains = [
("standardebooks.org", "Standard EBooks"),
@ -144,10 +140,15 @@ def init_link_domains(*_):
)
# pylint: disable=no-self-use
# pylint: disable=unused-argument
class Command(BaseCommand):
"""command-line options"""
help = "Initializes the database with starter data"
def add_arguments(self, parser):
"""specify which function to run"""
parser.add_argument(
"--limit",
default=None,
@ -155,6 +156,7 @@ class Command(BaseCommand):
)
def handle(self, *args, **options):
"""execute init"""
limit = options.get("limit")
tables = [
"group",
@ -164,7 +166,7 @@ class Command(BaseCommand):
"settings",
"linkdomain",
]
if limit not in tables:
if limit and limit not in tables:
raise Exception("Invalid table limit:", limit)
if not limit or limit == "group":

View file

@ -0,0 +1,21 @@
# Generated by Django 3.2.10 on 2022-01-24 20:01
import bookwyrm.models.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0129_auto_20220117_1716"),
]
operations = [
migrations.AlterField(
model_name="listitem",
name="notes",
field=bookwyrm.models.fields.TextField(
blank=True, max_length=300, null=True
),
),
]

View file

@ -0,0 +1,37 @@
# Generated by Django 3.2.10 on 2022-01-24 17:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0129_auto_20220117_1716"),
]
operations = [
migrations.AlterField(
model_name="user",
name="preferred_language",
field=models.CharField(
blank=True,
choices=[
("en-us", "English"),
("de-de", "Deutsch (German)"),
("es-es", "Español (Spanish)"),
("gl-es", "Galego (Galician)"),
("it-it", "Italiano (Italian)"),
("fr-fr", "Français (French)"),
("lt-lt", "Lietuvių (Lithuanian)"),
("no-no", "Norsk (Norwegian)"),
("pt-br", "Português do Brasil (Brazilian Portuguese)"),
("pt-pt", "Português Europeu (European Portuguese)"),
("sv-se", "Swedish (Svenska)"),
("zh-hans", "简体中文 (Simplified Chinese)"),
("zh-hant", "繁體中文 (Traditional Chinese)"),
],
max_length=255,
null=True,
),
),
]

View file

@ -0,0 +1,13 @@
# Generated by Django 3.2.10 on 2022-01-25 16:44
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0130_alter_listitem_notes"),
("bookwyrm", "0130_alter_user_preferred_language"),
]
operations = []

View file

@ -2,6 +2,7 @@
import uuid
from django.apps import apps
from django.core.exceptions import PermissionDenied
from django.db import models
from django.db.models import Q
from django.utils import timezone
@ -74,6 +75,22 @@ class List(OrderedCollectionMixin, BookWyrmModel):
return
super().raise_not_editable(viewer)
def raise_not_submittable(self, viewer):
"""can the user submit a book to the list?"""
# if you can't view the list you can't submit to it
self.raise_visible_to_user(viewer)
# all good if you're the owner or the list is open
if self.user == viewer or self.curation in ["open", "curated"]:
return
if self.curation == "group":
is_group_member = GroupMember.objects.filter(
group=self.group, user=viewer
).exists()
if is_group_member:
return
raise PermissionDenied()
@classmethod
def followers_filter(cls, queryset, viewer):
"""Override filter for "followers" privacy level to allow non-following
@ -125,7 +142,7 @@ class ListItem(CollectionItemMixin, BookWyrmModel):
user = fields.ForeignKey(
"User", on_delete=models.PROTECT, activitypub_field="actor"
)
notes = fields.TextField(blank=True, null=True)
notes = fields.TextField(blank=True, null=True, max_length=300)
approved = models.BooleanField(default=True)
order = fields.IntegerField()
endorsement = models.ManyToManyField("User", related_name="endorsers")

View file

@ -90,6 +90,14 @@ class SiteSettings(models.Model):
return get_absolute_url(uploaded)
return urljoin(STATIC_FULL_URL, default_path)
def save(self, *args, **kwargs):
"""if require_confirm_email is disabled, make sure no users are pending"""
if not self.require_confirm_email:
User.objects.filter(is_active=False, deactivation_reason="pending").update(
is_active=True, deactivation_reason=None
)
super().save(*args, **kwargs)
class SiteInvite(models.Model):
"""gives someone access to create an account on the instance"""

View file

@ -14,7 +14,7 @@ VERSION = "0.2.0"
PAGE_LENGTH = env("PAGE_LENGTH", 15)
DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English")
JS_CACHE = "76c5ff1f"
JS_CACHE = "7b5303af"
# email
EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend")
@ -245,7 +245,7 @@ AUTH_PASSWORD_VALIDATORS = [
# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/
LANGUAGE_CODE = "en-us"
LANGUAGE_CODE = env("LANGUAGE_CODE", "en-us")
LANGUAGES = [
("en-us", _("English")),
("de-de", _("Deutsch (German)")),
@ -257,6 +257,7 @@ LANGUAGES = [
("no-no", _("Norsk (Norwegian)")),
("pt-br", _("Português do Brasil (Brazilian Portuguese)")),
("pt-pt", _("Português Europeu (European Portuguese)")),
("sv-se", _("Swedish (Svenska)")),
("zh-hans", _("简体中文 (Simplified Chinese)")),
("zh-hant", _("繁體中文 (Traditional Chinese)")),
]

View file

@ -122,39 +122,13 @@ let BookWyrm = new (class {
*/
updateCountElement(counter, data) {
let count = data.count;
const count_by_type = data.count_by_type;
if (count === undefined) {
return;
}
const currentCount = counter.innerText;
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);
@ -517,7 +491,7 @@ let BookWyrm = new (class {
duplicateInput(event) {
const trigger = event.currentTarget;
const input_id = trigger.dataset["duplicate"];
const input_id = trigger.dataset.duplicate;
const orig = document.getElementById(input_id);
const parent = orig.parentNode;
const new_count = parent.querySelectorAll("input").length + 1;

View file

@ -12,6 +12,7 @@
{% block about_content %}
{# seven day cache #}
{% cache 604800 about_page %}
{% get_book_superlatives as superlatives %}
<section class="content pb-4">
<h2>
@ -26,7 +27,7 @@
</p>
<div class="columns">
{% if top_rated %}
{% if superlatives.top_rated %}
{% with book=superlatives.top_rated.default_edition rating=top_rated.rating %}
<div class="column is-one-third is-flex">
<div class="media notification">
@ -45,7 +46,7 @@
{% endwith %}
{% endif %}
{% if wanted %}
{% if superlatives.wanted %}
{% with book=superlatives.wanted.default_edition %}
<div class="column is-one-third is-flex">
<div class="media notification">
@ -64,7 +65,7 @@
{% endwith %}
{% endif %}
{% if controversial %}
{% if superlatives.controversial %}
{% with book=superlatives.controversial.default_edition %}
<div class="column is-one-third is-flex">
<div class="media notification">

View file

@ -141,12 +141,14 @@
<h2 class="title is-4">{% blocktrans with name=author.name %}Books by {{ name }}{% endblocktrans %}</h2>
<div class="columns is-multiline is-mobile">
{% for book in books %}
{% with book=book.default_edition %}
<div class="column is-one-fifth-tablet is-half-mobile is-flex is-flex-direction-column">
<div class="is-flex-grow-1">
{% include 'landing/small-book.html' with book=book %}
</div>
{% include 'snippets/shelve_button/shelve_button.html' with book=book %}
</div>
{% endwith %}
{% endfor %}
</div>

View file

@ -24,9 +24,12 @@
{# 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
href="{{ request.path }}"
class="transition-y is-hidden notification is-primary is-block"
data-poll-wrapper
>
<span data-poll="stream/{{ tab.key }}"></span>
</a>
{% if request.user.show_goal and not goal and tab.key == 'home' %}

View file

@ -9,7 +9,7 @@
<div class="modal is-active" role="dialog" aria-modal="true" aria-labelledby="get_started_header">
<div class="modal-background"></div>
<div class="modal-card is-fullwidth">
<header class="modal-card-head">
<header class="modal-card-head navbar">
<img
class="image logo mr-2"
src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}"

View file

@ -0,0 +1,45 @@
{% extends 'components/modal.html' %}
{% load i18n %}
{% load utilities %}
{% load group_tags %}
{% block modal-title %}
{% if list.curation == 'open' or request.user == list.user or list.group|is_member:request.user %}
{% blocktrans trimmed with title=book|book_title %}
Add "<em>{{ title }}</em>" to this list
{% endblocktrans %}
{% else %}
{% blocktrans trimmed with title=book|book_title %}
Suggest "<em>{{ title }}</em>" for this list
{% endblocktrans %}
{% endif %}
{% endblock %}
{% block modal-form-open %}
<form
name="add-book-{{ book.id }}"
method="POST"
action="{% url 'list-add-book' %}{% if query %}?q={{ query }}{% endif %}"
>
{% endblock %}
{% block modal-body %}
{% csrf_token %}
<input type="hidden" name="book" value="{{ book.id }}">
<input type="hidden" name="book_list" value="{{ list.id }}">
<input type="hidden" name="user" value="{{ request.user.id }}">
{% include "lists/item_notes_field.html" with form_id=id show_label=True %}
{% endblock %}
{% block modal-footer %}
<button type="submit" class="button is-link">
{% if list.curation == 'open' or request.user == list.user or list.group|is_member:request.user %}
{% trans "Add" %}
{% else %}
{% trans "Suggest" %}
{% endif %}
</button>
<button type="button" class="button" data-modal-close>{% trans "Cancel" %}</button>
{% endblock %}
{% block modal-form-close %}</form>{% endblock %}

View file

@ -1,5 +1,6 @@
{% extends 'lists/layout.html' %}
{% load i18n %}
{% load utilities %}
{% block breadcrumbs %}
<nav class="breadcrumb subtitle" aria-label="breadcrumbs">
@ -38,6 +39,17 @@
<div class="column ml-3">
{% include 'snippets/book_titleby.html' %}
{% if item.notes %}
<div>
{% url 'user-feed' item.user|username as user_path %}
{% blocktrans trimmed with username=item.user.display_name %}
<a href="{{ user_path }}">{{ username }}</a> says:
{% endblocktrans %}
<p class="notification">
{{ item.notes }}
</p>
</div>
{% endif %}
<p>
{% trans "Suggested by" %}

View file

@ -0,0 +1,20 @@
{% load i18n %}
<form
name="edit-notes-{{ item.id }}"
method="POST"
action="{% url 'list-item' list.id item.id %}"
>
{% csrf_token %}
<input type="hidden" name="book" value="{{ book.id }}">
<input type="hidden" name="book_list" value="{{ list.id }}">
<input type="hidden" name="user" value="{{ request.user.id }}">
{% include "lists/item_notes_field.html" with form_id=item.id %}
<div class="field">
<div class="control">
<button type="submit" class="button is-success">
{% trans "Save" %}
</button>
</div>
</div>
</form>

View file

@ -0,0 +1,21 @@
{% load i18n %}
<div class="field">
<label
for="id_notes_{{ form_id }}"
class="{% if show_label %}label{% else %}is-sr-only{% endif %}"
>
{% trans "Notes:" %}
</label>
<div class="control">
<textarea
class="textarea"
id="id_notes_{{ form_id }}"
maxlength="300"
name="notes"
aria-describedby="notes_description_{{ form_id }}"
>{{ item.notes|default:'' }}</textarea>
</div>
<p class="help" id="notes_description_{{ form_id }}">
{% trans "An optional note that will be displayed with the book." %}
</p>
</div>

View file

@ -1,9 +1,10 @@
{% extends 'lists/layout.html' %}
{% load i18n %}
{% load rating_tags %}
{% load book_display_tags %}
{% load group_tags %}
{% load book_display_tags %}
{% load markdown %}
{% load utilities %}
{% block breadcrumbs %}
<nav class="breadcrumb subtitle" aria-label="breadcrumbs">
@ -21,7 +22,7 @@
{% block panel %}
{% if request.user == list.user and pending_count %}
<div class="block content">
<p>
<p class="notification">
<a href="{% url 'list-curate' list.id %}">{{ pending_count }} book{{ pending_count|pluralize }} awaiting your approval</a>
</p>
</div>
@ -46,21 +47,16 @@
{% for item in items %}
<li class="block mb-5">
<div class="card">
{% with book=item.book %}
<div
class="
card-content p-0 mb-0
columns is-gapless
is-mobile
"
>
<div class="column is-3-mobile is-2-tablet is-cover align to-t">
<div class="card-content">
{% with book=item.book %}
<div class="columns is-mobile">
<div class="column is-narrow is-cover">
<a href="{{ item.book.local_path }}" aria-hidden="true">
{% include 'snippets/book_cover.html' with cover_class='is-w-auto is-h-m-tablet is-align-items-flex-start' size='medium' %}
</a>
</div>
<div class="column mx-3 my-2">
<div class="column">
<p>
{% include 'snippets/book_titleby.html' %}
</p>
@ -73,8 +69,54 @@
{% include 'snippets/shelve_button/shelve_button.html' with book=book %}
</div>
</div>
{% endwith %}
{% endwith %}
{% if item.notes %}
<div class="media notification">
<figure class="media-left" aria-hidden="true">
{% include "snippets/avatar.html" with user=item.user %}
</figure>
<div class="media-content">
<div class="content">
<header>
{% url 'user-feed' user|username as user_path %}
{% blocktrans trimmed with username=user.display_name %}
<a href="{{ user_path }}">{{ username }}</a> says:
{% endblocktrans %}
</header>
<p>
{{ item.notes|to_markdown|safe }}
</p>
</div>
{% if item.user == request.user %}
<div>
<details class="details-panel box">
<summary>
<span role="heading" aria-level="3">
{% trans "Edit notes" %}
<span class="details-close icon icon-pencil" aria-hidden></span>
</span>
</summary>
{% include "lists/edit_item_form.html" %}
</details>
</div>
{% endif %}
</div>
</div>
{% elif item.user == request.user %}
<div>
<details class="details-panel box">
<summary>
<span role="heading" aria-level="3">
{% trans "Add notes" %}
<span class="details-close icon icon-plus" aria-hidden></span>
</span>
</summary>
{% include "lists/edit_item_form.html" %}
</details>
</div>
{% endif %}
</div>
<div class="card-footer is-stacked-mobile has-background-white-bis is-align-items-stretch">
<div class="card-footer-item">
<p>
@ -195,23 +237,19 @@
<div class="column ml-3">
<p>{% include 'snippets/book_titleby.html' with book=book %}</p>
<form
class="mt-1"
name="add-book-{{ book.id }}"
method="post"
action="{% url 'list-add-book' %}{% if query %}?q={{ query }}{% endif %}"
{% join "add_item" list.id book.id as modal_id %}
<button
type="button"
class="button is-small is-link"
data-modal-open="{{ modal_id }}"
>
{% csrf_token %}
<input type="hidden" name="book" value="{{ book.id }}">
<input type="hidden" name="list" value="{{ list.id }}">
<button type="submit" class="button is-small is-link">
{% if list.curation == 'open' or request.user == list.user or list.group|is_member:request.user %}
{% trans "Add" %}
{% else %}
{% trans "Suggest" %}
{% endif %}
</button>
</form>
{% if list.curation == 'open' or request.user == list.user or list.group|is_member:request.user %}
{% trans "Add" %}
{% else %}
{% trans "Suggest" %}
{% endif %}
</button>
{% include "lists/add_item_modal.html" with id=modal_id %}
</div>
</div>
{% endfor %}
@ -225,7 +263,7 @@
<textarea
readonly
class="textarea is-small"
aria-labelledby="embed-label"
aria-describedby="embed-label"
data-copytext
data-copytext-label="{% trans 'Copy embed code' %}"
data-copytext-success="{% trans 'Copied!' %}"

View file

@ -1,5 +1,78 @@
# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
##### AhrefsBot #####
# see http://ahrefs.com/robot/
User-agent: AhrefsBot
Crawl-Delay: 10
#Disallow: /
##### SemrushBot #####
# see http://www.semrush.com/bot.html
User-agent: SemrushBot
Crawl-Delay: 10
#Disallow: /
# To block SemrushBot from crawling your site for different SEO and technical issues:
User-agent: SiteAuditBot
Disallow: /
#To block SemrushBot from crawling your site for Backlink Audit tool:
User-agent: SemrushBot-BA
Disallow: /
#To block SemrushBot from crawling your site for On Page SEO Checker tool and similar tools:
User-agent: SemrushBot-SI
Disallow: /
#To block SemrushBot from checking URLs on your site for SWA tool:
User-agent: SemrushBot-SWA
Disallow: /
#To block SemrushBot from crawling your site for Content Analyzer and Post Tracking tools:
User-agent: SemrushBot-CT
Disallow: /
#To block SemrushBot from crawling your site for Brand Monitoring:
User-agent: SemrushBot-BM
Disallow: /
#To block SplitSignalBot from crawling your site for SplitSignal tool:
User-agent: SplitSignalBot
Disallow: /
#To block SemrushBot-COUB from crawling your site for Content Outline Builder tool:
User-agent: SemrushBot-COUB
Disallow: /
##### DotBot #####
# see https://opensiteexplorer.org/dotbot
User-agent: dotbot
Crawl-delay: 10
#Disallow: /
##### BLEXBot #####
# see http://webmeup-crawler.com/
User-agent: BLEXBot
Crawl-delay: 10
#Disallow: /
##### MJ12bot #####
# see http://mj12bot.com/
User-Agent: MJ12bot
Crawl-Delay: 20
#Disallow: /
##### PetalBot #####
# see https://webmaster.petalsearch.com/site/petalbot
User-agent: PetalBot
Disallow: /
User-agent: *
Disallow: /static/js/
Disallow: /static/css/

View file

@ -92,7 +92,7 @@
</span>
{% with count=books.paginator.count %}
{% if count %}
<p class="help">
<span class="help">
{% blocktrans trimmed count counter=count with formatted_count=count|intcomma %}
{{ formatted_count }} book
{% plural %}
@ -104,7 +104,7 @@
(showing {{ start }}-{{ end }})
{% endblocktrans %}
{% endif %}
</p>
</span>
{% endif %}
{% endwith %}
</h2>

View file

@ -1,4 +1,8 @@
{% load static %}
<img class="avatar image {% if large %}is-96x96{% elif medium %}is-48x48{% else %}is-32x32{% endif %}" src="{% if user.avatar %}{% get_media_prefix %}{{ user.avatar }}{% else %}{% static "images/default_avi.jpg" %}{% endif %}" {% if ariaHide %}aria-hidden="true"{% endif %} alt="{{ user.alt_text }}">
<img
class="avatar image {% if large %}is-96x96{% elif medium %}is-48x48{% else %}is-32x32{% endif %}"
src="{% if user.avatar %}{% get_media_prefix %}{{ user.avatar }}{% else %}{% static "images/default_avi.jpg" %}{% endif %}"
{% if ariaHide %}aria-hidden="true"{% endif %}
alt="{{ user.alt_text }}"
>

View file

@ -17,7 +17,7 @@
{% if shelf.editable %}
<li role="menuitem" class="dropdown-item p-0">
<form name="shelve" action="/shelve/" method="post">
<form name="editable-shelve-{{ uuid }}" action="/shelve/" method="post">
{% csrf_token %}
<input type="hidden" name="book" value="{{ book.id }}">
<input type="hidden" name="change-shelf-from" value="{{ current.identifier }}">
@ -67,7 +67,7 @@
{% if user_shelf 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">
<form name="shelve-{{ user_shelf.identifier }}-{{ book.id }}-{{ uuid }}" action="/unshelve/" method="post">
{% csrf_token %}
<input type="hidden" name="book" value="{{ book.id }}">
<input type="hidden" name="shelf" value="{{ user_shelf.id }}">
@ -79,7 +79,7 @@
{% else %}
<li class="navbar-divider" role="separator" ></li>
<li role="menuitem" class="dropdown-item p-0">
<form name="shelve" action="/unshelve/" method="post">
<form name="un-shelve-{{ shelf.identifier }}-{{ book.id }}-{{ uuid }}" action="/unshelve/" method="post">
{% csrf_token %}
<input type="hidden" name="book" value="{{ book.id }}">
<input type="hidden" name="shelf" value="{{ shelf.id }}">

View file

@ -58,7 +58,7 @@
{% if active_shelf.shelf %}
<li role="menuitem" class="dropdown-item p-0" data-extra-options>
<form name="shelve" action="/unshelve/" method="post">
<form name="unshelve-{{ uuid }}-{{ shelf.identifier }}" action="/unshelve/" method="post">
{% csrf_token %}
<input type="hidden" name="book" value="{{ active_shelf.book.id }}">
<input type="hidden" name="shelf" value="{{ active_shelf.shelf.id }}">

View file

@ -0,0 +1,113 @@
""" test populating user streams """
from django.contrib.auth.models import Group, Permission
from django.test import TestCase
from bookwyrm import models
from bookwyrm.management.commands import initdb
class InitDB(TestCase):
"""gotta init that db"""
def test_init_groups(self):
"""Create groups"""
initdb.init_groups()
self.assertEqual(Group.objects.count(), 3)
self.assertTrue(Group.objects.filter(name="admin").exists())
self.assertTrue(Group.objects.filter(name="moderator").exists())
self.assertTrue(Group.objects.filter(name="editor").exists())
def test_init_permissions(self):
"""User permissions"""
initdb.init_groups()
initdb.init_permissions()
group = Group.objects.get(name="admin")
self.assertTrue(
group.permissions.filter(codename="edit_instance_settings").exists()
)
self.assertTrue(group.permissions.filter(codename="set_user_group").exists())
self.assertTrue(
group.permissions.filter(codename="control_federation").exists()
)
self.assertTrue(group.permissions.filter(codename="create_invites").exists())
self.assertTrue(group.permissions.filter(codename="moderate_user").exists())
self.assertTrue(group.permissions.filter(codename="moderate_post").exists())
self.assertTrue(group.permissions.filter(codename="edit_book").exists())
group = Group.objects.get(name="moderator")
self.assertTrue(group.permissions.filter(codename="set_user_group").exists())
self.assertTrue(
group.permissions.filter(codename="control_federation").exists()
)
self.assertTrue(group.permissions.filter(codename="create_invites").exists())
self.assertTrue(group.permissions.filter(codename="moderate_user").exists())
self.assertTrue(group.permissions.filter(codename="moderate_post").exists())
self.assertTrue(group.permissions.filter(codename="edit_book").exists())
group = Group.objects.get(name="editor")
self.assertTrue(group.permissions.filter(codename="edit_book").exists())
def test_init_connectors(self):
"""Outside data sources"""
initdb.init_connectors()
self.assertTrue(
models.Connector.objects.filter(identifier="bookwyrm.social").exists()
)
self.assertTrue(
models.Connector.objects.filter(identifier="inventaire.io").exists()
)
self.assertTrue(
models.Connector.objects.filter(identifier="openlibrary.org").exists()
)
def test_init_settings(self):
"""Create the settings file"""
initdb.init_settings()
settings = models.SiteSettings.objects.get()
self.assertEqual(settings.name, "BookWyrm")
def test_init_link_domains(self):
"""Common trusted domains for links"""
initdb.init_link_domains()
self.assertTrue(
models.LinkDomain.objects.filter(
status="approved", domain="standardebooks.org"
).exists()
)
self.assertTrue(
models.LinkDomain.objects.filter(
status="approved", domain="theanarchistlibrary.org"
).exists()
)
def test_command_no_args(self):
"""command line calls"""
command = initdb.Command()
command.handle()
# everything should have been called
self.assertEqual(Group.objects.count(), 3)
self.assertTrue(Permission.objects.exists())
self.assertEqual(models.Connector.objects.count(), 3)
self.assertEqual(models.FederatedServer.objects.count(), 2)
self.assertEqual(models.SiteSettings.objects.count(), 1)
self.assertEqual(models.LinkDomain.objects.count(), 5)
def test_command_with_args(self):
"""command line calls"""
command = initdb.Command()
command.handle(limit="group")
# everything should have been called
self.assertEqual(Group.objects.count(), 3)
self.assertEqual(models.Connector.objects.count(), 0)
self.assertEqual(models.FederatedServer.objects.count(), 0)
self.assertEqual(models.SiteSettings.objects.count(), 0)
self.assertEqual(models.LinkDomain.objects.count(), 0)
def test_command_invalid_args(self):
"""command line calls"""
command = initdb.Command()
with self.assertRaises(Exception):
command.handle(limit="sdkfjhsdkjf")

View file

@ -93,3 +93,48 @@ class SiteModels(TestCase):
token = models.PasswordReset.objects.create(user=self.local_user, code="hello")
self.assertTrue(token.valid())
self.assertEqual(token.link, f"https://{settings.DOMAIN}/password-reset/hello")
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
@patch("bookwyrm.suggested_users.remove_user_task.delay")
@patch("bookwyrm.activitystreams.populate_stream_task.delay")
@patch("bookwyrm.lists_stream.populate_lists_task.delay")
def test_change_confirmation_scheme(self, *_):
"""Switch from requiring email confirmation to not"""
site = models.SiteSettings.objects.create(
id=1, name="Fish Town", require_confirm_email=True
)
banned_user = models.User.objects.create_user(
"rat@local.com",
"rat@rat.com",
"ratword",
local=True,
localname="rat",
remote_id="https://example.com/users/rat",
confirmation_code="HELLO",
)
banned_user.is_active = False
banned_user.deactivation_reason = "banned"
banned_user.save(broadcast=False)
pending_user = models.User.objects.create_user(
"nutria@local.com",
"nutria@nutria.com",
"nutriaword",
local=True,
localname="nutria",
remote_id="https://example.com/users/nutria",
confirmation_code="HELLO",
)
pending_user.is_active = False
pending_user.deactivation_reason = "pending"
pending_user.save(broadcast=False)
site.require_confirm_email = False
site.save()
pending_user.refresh_from_db()
self.assertTrue(pending_user.is_active)
self.assertIsNone(pending_user.deactivation_reason)
banned_user.refresh_from_db()
self.assertFalse(banned_user.is_active)
self.assertIsNotNone(banned_user.deactivation_reason)

View file

@ -1,4 +1,5 @@
""" test for app action functionality """
import os
import json
from unittest.mock import patch
@ -207,3 +208,6 @@ class FederationViews(TestCase):
created = models.FederatedServer.objects.get(server_name="server.name")
self.assertEqual(created.status, "blocked")
self.assertEqual(created.notes, "https://explanation.url")
# remove file.json after test
os.remove("file.json")

View file

@ -118,6 +118,7 @@ class InboxAdd(TestCase):
"type": "ListItem",
"book": self.book.remote_id,
"id": "https://example.com/listbook/6189",
"notes": "hi hello",
"order": 1,
},
"target": "https://example.com/user/mouse/list/to-read",
@ -130,3 +131,4 @@ class InboxAdd(TestCase):
self.assertEqual(booklist.name, "Test List")
self.assertEqual(booklist.books.first(), self.book)
self.assertEqual(listitem.remote_id, "https://example.com/listbook/6189")
self.assertEqual(listitem.notes, "hi hello")

View file

@ -0,0 +1 @@
from . import *

View file

@ -0,0 +1,129 @@
""" test for app action functionality """
import json
from unittest.mock import patch
from django.contrib.auth.models import AnonymousUser
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import models, views
from bookwyrm.tests.validate_html import validate_html
# pylint: disable=unused-argument
class ListViews(TestCase):
"""list view"""
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
"bookwyrm.activitystreams.populate_stream_task.delay"
), patch("bookwyrm.lists_stream.populate_lists_task.delay"):
self.local_user = models.User.objects.create_user(
"mouse@local.com",
"mouse@mouse.com",
"mouseword",
local=True,
localname="mouse",
remote_id="https://example.com/users/mouse",
)
work = models.Work.objects.create(title="Work")
self.book = models.Edition.objects.create(
title="Example Edition",
remote_id="https://example.com/book/1",
parent_work=work,
)
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
self.list = models.List.objects.create(
name="Test List", user=self.local_user
)
self.anonymous_user = AnonymousUser
self.anonymous_user.is_authenticated = False
models.SiteSettings.objects.create()
def test_curate_page(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.Curate.as_view()
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=False,
order=1,
)
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request.user = self.anonymous_user
result = view(request, self.list.id)
self.assertEqual(result.status_code, 302)
def test_curate_approve(self):
"""approve a pending item"""
view = views.Curate.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
pending = models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=False,
order=1,
)
request = self.factory.post(
"",
{"item": pending.id, "approved": "true"},
)
request.user = self.local_user
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
) as mock:
view(request, self.list.id)
self.assertEqual(mock.call_count, 2)
activity = json.loads(mock.call_args[1]["args"][1])
self.assertEqual(activity["type"], "Add")
self.assertEqual(activity["actor"], self.local_user.remote_id)
self.assertEqual(activity["target"], self.list.remote_id)
pending.refresh_from_db()
self.assertEqual(self.list.books.count(), 1)
self.assertEqual(self.list.listitem_set.first(), pending)
self.assertTrue(pending.approved)
def test_curate_reject(self):
"""approve a pending item"""
view = views.Curate.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
pending = models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=False,
order=1,
)
request = self.factory.post(
"",
{
"item": pending.id,
"approved": "false",
},
)
request.user = self.local_user
view(request, self.list.id)
self.assertFalse(self.list.books.exists())
self.assertFalse(models.ListItem.objects.exists())

View file

@ -0,0 +1,89 @@
""" test for app action functionality """
from unittest.mock import patch
from django.contrib.auth.models import AnonymousUser
from django.http.response import Http404
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import models, views
from bookwyrm.tests.validate_html import validate_html
# pylint: disable=unused-argument
class ListViews(TestCase):
"""list view"""
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
"bookwyrm.activitystreams.populate_stream_task.delay"
), patch("bookwyrm.lists_stream.populate_lists_task.delay"):
self.local_user = models.User.objects.create_user(
"mouse@local.com",
"mouse@mouse.com",
"mouseword",
local=True,
localname="mouse",
remote_id="https://example.com/users/mouse",
)
work = models.Work.objects.create(title="Work")
self.book = models.Edition.objects.create(
title="Example Edition",
remote_id="https://example.com/book/1",
parent_work=work,
)
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
self.list = models.List.objects.create(
name="Test List", user=self.local_user
)
self.anonymous_user = AnonymousUser
self.anonymous_user.is_authenticated = False
models.SiteSettings.objects.create()
def test_embed_call_without_key(self):
"""there are so many views, this just makes sure it DOESNT load"""
view = views.unsafe_embed_list
request = self.factory.get("")
request.user = self.anonymous_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=True,
order=1,
)
with patch("bookwyrm.views.list.list.is_api_request") as is_api:
is_api.return_value = False
with self.assertRaises(Http404):
view(request, self.list.id, "")
def test_embed_call_with_key(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.unsafe_embed_list
request = self.factory.get("")
request.user = self.anonymous_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=True,
order=1,
)
embed_key = str(self.list.embed_key.hex)
with patch("bookwyrm.views.list.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id, embed_key)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)

View file

@ -4,14 +4,19 @@ from unittest.mock import patch
from django.contrib.auth.models import AnonymousUser
from django.core.exceptions import PermissionDenied
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import models, views
from bookwyrm.activitypub import ActivitypubResponse
from bookwyrm.tests.validate_html import validate_html
# pylint: disable=unused-argument
class ListActionViews(TestCase):
"""tag views"""
# pylint: disable=too-many-public-methods
class ListViews(TestCase):
"""list view"""
def setUp(self):
"""we need basic test data and mocks"""
@ -35,7 +40,6 @@ class ListActionViews(TestCase):
localname="rat",
remote_id="https://example.com/users/rat",
)
work = models.Work.objects.create(title="Work")
self.book = models.Edition.objects.create(
title="Example Edition",
@ -67,8 +71,194 @@ class ListActionViews(TestCase):
)
self.anonymous_user = AnonymousUser
self.anonymous_user.is_authenticated = False
models.SiteSettings.objects.create()
def test_list_page(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.List.as_view()
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=True,
order=1,
)
with patch("bookwyrm.views.list.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_list_page_with_query(self):
"""searching for a book to add"""
view = views.List.as_view()
request = self.factory.get("", {"q": "Example Edition"})
request.user = self.local_user
with patch("bookwyrm.views.list.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_list_page_sorted(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.List.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
for (i, book) in enumerate([self.book, self.book_two, self.book_three]):
models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=book,
approved=True,
order=i + 1,
)
request = self.factory.get("/?sort_by=order")
request.user = self.local_user
with patch("bookwyrm.views.list.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request = self.factory.get("/?sort_by=title")
request.user = self.local_user
with patch("bookwyrm.views.list.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request = self.factory.get("/?sort_by=rating")
request.user = self.local_user
with patch("bookwyrm.views.list.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request = self.factory.get("/?sort_by=sdkfh")
request.user = self.local_user
with patch("bookwyrm.views.list.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_list_page_empty(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.List.as_view()
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.views.list.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_list_page_logged_out(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.List.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=True,
order=1,
)
request = self.factory.get("")
request.user = self.anonymous_user
with patch("bookwyrm.views.list.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_list_page_json_view(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.List.as_view()
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=True,
order=1,
)
with patch("bookwyrm.views.list.list.is_api_request") as is_api:
is_api.return_value = True
result = view(request, self.list.id)
self.assertIsInstance(result, ActivitypubResponse)
self.assertEqual(result.status_code, 200)
def test_list_page_json_view_page(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.List.as_view()
request = self.factory.get("")
request.user = self.local_user
request = self.factory.get("/?page=1")
request.user = self.local_user
with patch("bookwyrm.views.list.list.is_api_request") as is_api:
is_api.return_value = True
result = view(request, self.list.id)
self.assertIsInstance(result, ActivitypubResponse)
self.assertEqual(result.status_code, 200)
def test_list_edit(self):
"""edit a list"""
view = views.List.as_view()
request = self.factory.post(
"",
{
"name": "New Name",
"description": "wow",
"privacy": "direct",
"curation": "curated",
"user": self.local_user.id,
},
)
request.user = self.local_user
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
) as mock:
result = view(request, self.list.id)
self.assertEqual(mock.call_count, 1)
activity = json.loads(mock.call_args[1]["args"][1])
self.assertEqual(activity["type"], "Update")
self.assertEqual(activity["actor"], self.local_user.remote_id)
self.assertEqual(activity["object"]["id"], self.list.remote_id)
self.assertEqual(result.status_code, 302)
self.list.refresh_from_db()
self.assertEqual(self.list.name, "New Name")
self.assertEqual(self.list.description, "wow")
self.assertEqual(self.list.privacy, "direct")
self.assertEqual(self.list.curation, "curated")
def test_delete_list(self):
"""delete an entire list"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
@ -110,73 +300,14 @@ class ListActionViews(TestCase):
with self.assertRaises(PermissionDenied):
views.delete_list(request, self.list.id)
def test_curate_approve(self):
"""approve a pending item"""
view = views.Curate.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
pending = models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=False,
order=1,
)
request = self.factory.post(
"",
{"item": pending.id, "approved": "true"},
)
request.user = self.local_user
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
) as mock:
view(request, self.list.id)
self.assertEqual(mock.call_count, 2)
activity = json.loads(mock.call_args[1]["args"][1])
self.assertEqual(activity["type"], "Add")
self.assertEqual(activity["actor"], self.local_user.remote_id)
self.assertEqual(activity["target"], self.list.remote_id)
pending.refresh_from_db()
self.assertEqual(self.list.books.count(), 1)
self.assertEqual(self.list.listitem_set.first(), pending)
self.assertTrue(pending.approved)
def test_curate_reject(self):
"""approve a pending item"""
view = views.Curate.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
pending = models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=False,
order=1,
)
request = self.factory.post(
"",
{
"item": pending.id,
"approved": "false",
},
)
request.user = self.local_user
view(request, self.list.id)
self.assertFalse(self.list.books.exists())
self.assertFalse(models.ListItem.objects.exists())
def test_add_book(self):
"""put a book on a list"""
request = self.factory.post(
"",
{
"book": self.book.id,
"list": self.list.id,
"book_list": self.list.id,
"user": self.local_user.id,
},
)
request.user = self.local_user
@ -184,7 +315,7 @@ class ListActionViews(TestCase):
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
) as mock:
views.list.add_book(request)
views.add_book(request)
self.assertEqual(mock.call_count, 1)
activity = json.loads(mock.call_args[1]["args"][1])
self.assertEqual(activity["type"], "Add")
@ -205,7 +336,8 @@ class ListActionViews(TestCase):
"",
{
"book": self.book.id,
"list": self.list.id,
"book_list": self.list.id,
"user": self.local_user.id,
},
)
request_one.user = self.local_user
@ -214,13 +346,14 @@ class ListActionViews(TestCase):
"",
{
"book": self.book_two.id,
"list": self.list.id,
"book_list": self.list.id,
"user": self.local_user.id,
},
)
request_two.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
views.list.add_book(request_one)
views.list.add_book(request_two)
views.add_book(request_one)
views.add_book(request_two)
items = self.list.listitem_set.order_by("order").all()
self.assertEqual(items[0].book, self.book)
@ -237,7 +370,8 @@ class ListActionViews(TestCase):
"",
{
"book": self.book.id,
"list": self.list.id,
"book_list": self.list.id,
"user": self.local_user.id,
},
)
request_one.user = self.local_user
@ -246,7 +380,8 @@ class ListActionViews(TestCase):
"",
{
"book": self.book_two.id,
"list": self.list.id,
"book_list": self.list.id,
"user": self.local_user.id,
},
)
request_two.user = self.local_user
@ -255,15 +390,16 @@ class ListActionViews(TestCase):
"",
{
"book": self.book_three.id,
"list": self.list.id,
"book_list": self.list.id,
"user": self.local_user.id,
},
)
request_three.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
views.list.add_book(request_one)
views.list.add_book(request_two)
views.list.add_book(request_three)
views.add_book(request_one)
views.add_book(request_two)
views.add_book(request_three)
items = self.list.listitem_set.order_by("order").all()
self.assertEqual(items[0].book, self.book)
@ -276,7 +412,7 @@ class ListActionViews(TestCase):
remove_request = self.factory.post("", {"item": items[1].id})
remove_request.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
views.list.remove_book(remove_request, self.list.id)
views.remove_book(remove_request, self.list.id)
items = self.list.listitem_set.order_by("order").all()
self.assertEqual(items[0].book, self.book)
self.assertEqual(items[1].book, self.book_three)
@ -293,7 +429,8 @@ class ListActionViews(TestCase):
"",
{
"book": self.book_three.id,
"list": self.list.id,
"book_list": self.list.id,
"user": self.local_user.id,
},
)
request.user = self.local_user
@ -312,7 +449,7 @@ class ListActionViews(TestCase):
approved=False,
order=2,
)
views.list.add_book(request)
views.add_book(request)
items = self.list.listitem_set.order_by("order").all()
self.assertEqual(items[0].book, self.book)
@ -403,7 +540,8 @@ class ListActionViews(TestCase):
"",
{
"book": self.book.id,
"list": self.list.id,
"book_list": self.list.id,
"user": self.local_user.id,
},
)
request_one.user = self.local_user
@ -412,7 +550,8 @@ class ListActionViews(TestCase):
"",
{
"book": self.book_two.id,
"list": self.list.id,
"book_list": self.list.id,
"user": self.local_user.id,
},
)
request_two.user = self.local_user
@ -421,15 +560,16 @@ class ListActionViews(TestCase):
"",
{
"book": self.book_three.id,
"list": self.list.id,
"book_list": self.list.id,
"user": self.local_user.id,
},
)
request_three.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
views.list.add_book(request_one)
views.list.add_book(request_two)
views.list.add_book(request_three)
views.add_book(request_one)
views.add_book(request_two)
views.add_book(request_three)
items = self.list.listitem_set.order_by("order").all()
self.assertEqual(items[0].book, self.book)
@ -442,7 +582,7 @@ class ListActionViews(TestCase):
set_position_request = self.factory.post("", {"position": 1})
set_position_request.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
views.list.set_book_position(set_position_request, items[2].id)
views.set_book_position(set_position_request, items[2].id)
items = self.list.listitem_set.order_by("order").all()
self.assertEqual(items[0].book, self.book_three)
self.assertEqual(items[1].book, self.book)
@ -459,7 +599,8 @@ class ListActionViews(TestCase):
"",
{
"book": self.book.id,
"list": self.list.id,
"book_list": self.list.id,
"user": self.rat.id,
},
)
request.user = self.rat
@ -467,7 +608,7 @@ class ListActionViews(TestCase):
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
) as mock:
views.list.add_book(request)
views.add_book(request)
self.assertEqual(mock.call_count, 1)
activity = json.loads(mock.call_args[1]["args"][1])
self.assertEqual(activity["type"], "Add")
@ -487,7 +628,8 @@ class ListActionViews(TestCase):
"",
{
"book": self.book.id,
"list": self.list.id,
"book_list": self.list.id,
"user": self.rat.id,
},
)
request.user = self.rat
@ -495,7 +637,7 @@ class ListActionViews(TestCase):
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
) as mock:
views.list.add_book(request)
views.add_book(request)
self.assertEqual(mock.call_count, 1)
activity = json.loads(mock.call_args[1]["args"][1])
@ -519,7 +661,8 @@ class ListActionViews(TestCase):
"",
{
"book": self.book.id,
"list": self.list.id,
"book_list": self.list.id,
"user": self.local_user.id,
},
)
request.user = self.local_user
@ -527,7 +670,7 @@ class ListActionViews(TestCase):
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
) as mock:
views.list.add_book(request)
views.add_book(request)
self.assertEqual(mock.call_count, 1)
activity = json.loads(mock.call_args[1]["args"][1])
self.assertEqual(activity["type"], "Add")
@ -539,6 +682,23 @@ class ListActionViews(TestCase):
self.assertEqual(item.user, self.local_user)
self.assertTrue(item.approved)
def test_add_book_permission_denied(self):
"""you can't add to that list"""
self.list.curation = "closed"
self.list.save(broadcast=False)
request = self.factory.post(
"",
{
"book": self.book.id,
"book_list": self.list.id,
"user": self.rat.id,
},
)
request.user = self.rat
with self.assertRaises(PermissionDenied):
views.add_book(request)
def test_remove_book(self):
"""take an item off a list"""
@ -555,7 +715,7 @@ class ListActionViews(TestCase):
request.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
views.list.remove_book(request, self.list.id)
views.remove_book(request, self.list.id)
self.assertFalse(self.list.listitem_set.exists())
def test_remove_book_unauthorized(self):
@ -569,7 +729,7 @@ class ListActionViews(TestCase):
request.user = self.rat
with self.assertRaises(PermissionDenied):
views.list.remove_book(request, self.list.id)
views.remove_book(request, self.list.id)
self.assertTrue(self.list.listitem_set.exists())
def test_save_unsave_list(self):

View file

@ -0,0 +1,70 @@
""" test for app action functionality """
from unittest.mock import patch
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import models, views
# pylint: disable=unused-argument
# pylint: disable=too-many-public-methods
class ListItemViews(TestCase):
"""list view"""
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
"bookwyrm.activitystreams.populate_stream_task.delay"
), patch("bookwyrm.lists_stream.populate_lists_task.delay"):
self.local_user = models.User.objects.create_user(
"mouse@local.com",
"mouse@mouse.com",
"mouseword",
local=True,
localname="mouse",
remote_id="https://example.com/users/mouse",
)
work = models.Work.objects.create(title="Work")
self.book = models.Edition.objects.create(
title="Example Edition",
remote_id="https://example.com/book/1",
parent_work=work,
)
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
self.list = models.List.objects.create(
name="Test List", user=self.local_user
)
models.SiteSettings.objects.create()
def test_add_list_item_notes(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.ListItem.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
item = models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=True,
order=1,
)
request = self.factory.post(
"",
{
"book_list": self.list.id,
"book": self.book.id,
"user": self.local_user.id,
"notes": "beep boop",
},
)
request.user = self.local_user
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
) as mock:
view(request, self.list.id, item.id)
self.assertEqual(mock.call_count, 1)
item.refresh_from_db()
self.assertEqual(item.notes, "beep boop")

View file

@ -0,0 +1,161 @@
""" test for app action functionality """
import json
from unittest.mock import patch
from django.contrib.auth.models import AnonymousUser
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import models, views
from bookwyrm.tests.validate_html import validate_html
# pylint: disable=unused-argument
class ListViews(TestCase):
"""lists of lists"""
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
"bookwyrm.activitystreams.populate_stream_task.delay"
), patch("bookwyrm.lists_stream.populate_lists_task.delay"):
self.local_user = models.User.objects.create_user(
"mouse@local.com",
"mouse@mouse.com",
"mouseword",
local=True,
localname="mouse",
remote_id="https://example.com/users/mouse",
)
self.anonymous_user = AnonymousUser
self.anonymous_user.is_authenticated = False
models.SiteSettings.objects.create()
@patch("bookwyrm.lists_stream.ListsStream.get_list_stream")
def test_lists_page(self, _):
"""there are so many views, this just makes sure it LOADS"""
view = views.Lists.as_view()
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
), patch("bookwyrm.lists_stream.add_list_task.delay"):
models.List.objects.create(name="Public list", user=self.local_user)
models.List.objects.create(
name="Private list", privacy="direct", user=self.local_user
)
request = self.factory.get("")
request.user = self.local_user
result = view(request)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request.user = self.anonymous_user
result = view(request)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_saved_lists_page(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.SavedLists.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
booklist = models.List.objects.create(
name="Public list", user=self.local_user
)
models.List.objects.create(
name="Private list", privacy="direct", user=self.local_user
)
self.local_user.saved_lists.add(booklist)
request = self.factory.get("")
request.user = self.local_user
result = view(request)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
self.assertEqual(result.context_data["lists"].object_list, [booklist])
def test_saved_lists_page_empty(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.SavedLists.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.List.objects.create(name="Public list", user=self.local_user)
models.List.objects.create(
name="Private list", privacy="direct", user=self.local_user
)
request = self.factory.get("")
request.user = self.local_user
result = view(request)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
self.assertEqual(len(result.context_data["lists"].object_list), 0)
def test_saved_lists_page_logged_out(self):
"""logged out saved lists"""
view = views.SavedLists.as_view()
request = self.factory.get("")
request.user = self.anonymous_user
result = view(request)
self.assertEqual(result.status_code, 302)
def test_user_lists_page(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.UserLists.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.List.objects.create(name="Public list", user=self.local_user)
models.List.objects.create(
name="Private list", privacy="direct", user=self.local_user
)
request = self.factory.get("")
request.user = self.local_user
result = view(request, self.local_user.localname)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_user_lists_page_logged_out(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.UserLists.as_view()
request = self.factory.get("")
request.user = self.anonymous_user
result = view(request, self.local_user.username)
self.assertEqual(result.status_code, 302)
def test_lists_create(self):
"""create list view"""
view = views.Lists.as_view()
request = self.factory.post(
"",
{
"name": "A list",
"description": "wow",
"privacy": "unlisted",
"curation": "open",
"user": self.local_user.id,
},
)
request.user = self.local_user
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
) as mock:
result = view(request)
self.assertEqual(mock.call_count, 1)
activity = json.loads(mock.call_args[1]["args"][1])
self.assertEqual(activity["type"], "Create")
self.assertEqual(activity["actor"], self.local_user.remote_id)
self.assertEqual(result.status_code, 302)
new_list = models.List.objects.filter(name="A list").get()
self.assertEqual(new_list.description, "wow")
self.assertEqual(new_list.privacy, "unlisted")
self.assertEqual(new_list.curation, "open")

View file

@ -51,6 +51,11 @@ class ShelfViews(TestCase):
def test_shelf_page_all_books(self, *_):
"""there are so many views, this just makes sure it LOADS"""
models.ShelfBook.objects.create(
book=self.book,
shelf=self.shelf,
user=self.local_user,
)
view = views.Shelf.as_view()
request = self.factory.get("")
request.user = self.local_user
@ -61,6 +66,41 @@ class ShelfViews(TestCase):
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_shelf_page_all_books_empty(self, *_):
"""No books shelved"""
view = views.Shelf.as_view()
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.views.shelf.shelf.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.local_user.username)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_shelf_page_all_books_avoid_duplicates(self, *_):
"""Make sure books aren't showing up twice on the all shelves view"""
models.ShelfBook.objects.create(
book=self.book,
shelf=self.shelf,
user=self.local_user,
)
models.ShelfBook.objects.create(
book=self.book,
shelf=self.local_user.shelf_set.first(),
user=self.local_user,
)
view = views.Shelf.as_view()
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.views.shelf.shelf.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.local_user.username)
self.assertEqual(result.context_data["books"].object_list.count(), 1)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_shelf_page_all_books_json(self, *_):
"""there is no json view here"""
view = views.Shelf.as_view()

View file

@ -1,438 +0,0 @@
""" test for app action functionality """
import json
from unittest.mock import patch
from django.contrib.auth.models import AnonymousUser
from django.http.response import Http404
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import models, views
from bookwyrm.activitypub import ActivitypubResponse
from bookwyrm.tests.validate_html import validate_html
# pylint: disable=unused-argument
class ListViews(TestCase):
"""tag views"""
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
"bookwyrm.activitystreams.populate_stream_task.delay"
), patch("bookwyrm.lists_stream.populate_lists_task.delay"):
self.local_user = models.User.objects.create_user(
"mouse@local.com",
"mouse@mouse.com",
"mouseword",
local=True,
localname="mouse",
remote_id="https://example.com/users/mouse",
)
self.rat = models.User.objects.create_user(
"rat@local.com",
"rat@rat.com",
"ratword",
local=True,
localname="rat",
remote_id="https://example.com/users/rat",
)
work = models.Work.objects.create(title="Work")
self.book = models.Edition.objects.create(
title="Example Edition",
remote_id="https://example.com/book/1",
parent_work=work,
)
work_two = models.Work.objects.create(title="Labori")
self.book_two = models.Edition.objects.create(
title="Example Edition 2",
remote_id="https://example.com/book/2",
parent_work=work_two,
)
work_three = models.Work.objects.create(title="Trabajar")
self.book_three = models.Edition.objects.create(
title="Example Edition 3",
remote_id="https://example.com/book/3",
parent_work=work_three,
)
work_four = models.Work.objects.create(title="Travailler")
self.book_four = models.Edition.objects.create(
title="Example Edition 4",
remote_id="https://example.com/book/4",
parent_work=work_four,
)
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
self.list = models.List.objects.create(
name="Test List", user=self.local_user
)
self.anonymous_user = AnonymousUser
self.anonymous_user.is_authenticated = False
models.SiteSettings.objects.create()
@patch("bookwyrm.lists_stream.ListsStream.get_list_stream")
def test_lists_page(self, _):
"""there are so many views, this just makes sure it LOADS"""
view = views.Lists.as_view()
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
), patch("bookwyrm.lists_stream.add_list_task.delay"):
models.List.objects.create(name="Public list", user=self.local_user)
models.List.objects.create(
name="Private list", privacy="direct", user=self.local_user
)
request = self.factory.get("")
request.user = self.local_user
result = view(request)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request.user = self.anonymous_user
result = view(request)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_saved_lists_page(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.SavedLists.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
booklist = models.List.objects.create(
name="Public list", user=self.local_user
)
models.List.objects.create(
name="Private list", privacy="direct", user=self.local_user
)
self.local_user.saved_lists.add(booklist)
request = self.factory.get("")
request.user = self.local_user
result = view(request)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
self.assertEqual(result.context_data["lists"].object_list, [booklist])
def test_saved_lists_page_empty(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.SavedLists.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.List.objects.create(name="Public list", user=self.local_user)
models.List.objects.create(
name="Private list", privacy="direct", user=self.local_user
)
request = self.factory.get("")
request.user = self.local_user
result = view(request)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
self.assertEqual(len(result.context_data["lists"].object_list), 0)
def test_saved_lists_page_logged_out(self):
"""logged out saved lists"""
view = views.SavedLists.as_view()
request = self.factory.get("")
request.user = self.anonymous_user
result = view(request)
self.assertEqual(result.status_code, 302)
def test_lists_create(self):
"""create list view"""
view = views.Lists.as_view()
request = self.factory.post(
"",
{
"name": "A list",
"description": "wow",
"privacy": "unlisted",
"curation": "open",
"user": self.local_user.id,
},
)
request.user = self.local_user
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
) as mock:
result = view(request)
self.assertEqual(mock.call_count, 1)
activity = json.loads(mock.call_args[1]["args"][1])
self.assertEqual(activity["type"], "Create")
self.assertEqual(activity["actor"], self.local_user.remote_id)
self.assertEqual(result.status_code, 302)
new_list = models.List.objects.filter(name="A list").get()
self.assertEqual(new_list.description, "wow")
self.assertEqual(new_list.privacy, "unlisted")
self.assertEqual(new_list.curation, "open")
def test_list_page(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.List.as_view()
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=True,
order=1,
)
with patch("bookwyrm.views.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_list_page_sorted(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.List.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
for (i, book) in enumerate([self.book, self.book_two, self.book_three]):
models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=book,
approved=True,
order=i + 1,
)
request = self.factory.get("/?sort_by=order")
request.user = self.local_user
with patch("bookwyrm.views.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request = self.factory.get("/?sort_by=title")
request.user = self.local_user
with patch("bookwyrm.views.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request = self.factory.get("/?sort_by=rating")
request.user = self.local_user
with patch("bookwyrm.views.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request = self.factory.get("/?sort_by=sdkfh")
request.user = self.local_user
with patch("bookwyrm.views.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_list_page_empty(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.List.as_view()
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.views.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_list_page_logged_out(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.List.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=True,
order=1,
)
request = self.factory.get("")
request.user = self.anonymous_user
with patch("bookwyrm.views.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_list_page_json_view(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.List.as_view()
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=True,
order=1,
)
with patch("bookwyrm.views.list.is_api_request") as is_api:
is_api.return_value = True
result = view(request, self.list.id)
self.assertIsInstance(result, ActivitypubResponse)
self.assertEqual(result.status_code, 200)
def test_list_page_json_view_page(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.List.as_view()
request = self.factory.get("")
request.user = self.local_user
request = self.factory.get("/?page=1")
request.user = self.local_user
with patch("bookwyrm.views.list.is_api_request") as is_api:
is_api.return_value = True
result = view(request, self.list.id)
self.assertIsInstance(result, ActivitypubResponse)
self.assertEqual(result.status_code, 200)
def test_list_edit(self):
"""edit a list"""
view = views.List.as_view()
request = self.factory.post(
"",
{
"name": "New Name",
"description": "wow",
"privacy": "direct",
"curation": "curated",
"user": self.local_user.id,
},
)
request.user = self.local_user
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
) as mock:
result = view(request, self.list.id)
self.assertEqual(mock.call_count, 1)
activity = json.loads(mock.call_args[1]["args"][1])
self.assertEqual(activity["type"], "Update")
self.assertEqual(activity["actor"], self.local_user.remote_id)
self.assertEqual(activity["object"]["id"], self.list.remote_id)
self.assertEqual(result.status_code, 302)
self.list.refresh_from_db()
self.assertEqual(self.list.name, "New Name")
self.assertEqual(self.list.description, "wow")
self.assertEqual(self.list.privacy, "direct")
self.assertEqual(self.list.curation, "curated")
def test_curate_page(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.Curate.as_view()
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=False,
order=1,
)
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request.user = self.anonymous_user
result = view(request, self.list.id)
self.assertEqual(result.status_code, 302)
def test_user_lists_page(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.UserLists.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.List.objects.create(name="Public list", user=self.local_user)
models.List.objects.create(
name="Private list", privacy="direct", user=self.local_user
)
request = self.factory.get("")
request.user = self.local_user
result = view(request, self.local_user.localname)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_user_lists_page_logged_out(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.UserLists.as_view()
request = self.factory.get("")
request.user = self.anonymous_user
result = view(request, self.local_user.username)
self.assertEqual(result.status_code, 302)
def test_embed_call_without_key(self):
"""there are so many views, this just makes sure it DOESNT load"""
view = views.unsafe_embed_list
request = self.factory.get("")
request.user = self.anonymous_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=True,
order=1,
)
with patch("bookwyrm.views.list.is_api_request") as is_api:
is_api.return_value = False
with self.assertRaises(Http404):
view(request, self.list.id, "")
def test_embed_call_with_key(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.unsafe_embed_list
request = self.factory.get("")
request.user = self.anonymous_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.ListItem.objects.create(
book_list=self.list,
user=self.local_user,
book=self.book,
approved=True,
order=1,
)
embed_key = str(self.list.embed_key.hex)
with patch("bookwyrm.views.list.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.list.id, embed_key)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)

View file

@ -45,31 +45,51 @@ class UpdateViews(TestCase):
data = json.loads(result.getvalue())
self.assertEqual(data["count"], 1)
def test_get_unread_status_count(self):
def test_get_unread_status_string(self):
"""there are so many views, this just makes sure it LOADS"""
request = self.factory.get("")
request.user = self.local_user
with patch(
"bookwyrm.activitystreams.ActivityStream.get_unread_count"
) as mock_count:
with patch(
# pylint:disable=line-too-long
"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")
) as mock_count, 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_string(request, "home")
self.assertIsInstance(result, JsonResponse)
data = json.loads(result.getvalue())
self.assertEqual(data["count"], 3)
self.assertEqual(data["count_by_type"]["review"], 5)
self.assertEqual(data["count"], "Load 5 unread statuses")
def test_get_unread_status_count_invalid_stream(self):
def test_get_unread_status_string_with_filters(self):
"""there are so many views, this just makes sure it LOADS"""
self.local_user.feed_status_types = ["comment", "everything"]
request = self.factory.get("")
request.user = self.local_user
with patch(
"bookwyrm.activitystreams.ActivityStream.get_unread_count"
) as mock_count, 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 = {
"generated_note": 1,
"comment": 1,
"review": 10,
}
result = views.get_unread_status_string(request, "home")
self.assertIsInstance(result, JsonResponse)
data = json.loads(result.getvalue())
self.assertEqual(data["count"], "Load 2 unread statuses")
def test_get_unread_status_string_invalid_stream(self):
"""there are so many views, this just makes sure it LOADS"""
request = self.factory.get("")
request.user = self.local_user
with self.assertRaises(Http404):
views.get_unread_status_count(request, "fish")
views.get_unread_status_string(request, "fish")

View file

@ -49,7 +49,9 @@ urlpatterns = [
re_path(r"^ostatus_subscribe/?$", views.ostatus_follow_request),
# polling updates
re_path("^api/updates/notifications/?$", views.get_notification_count),
re_path("^api/updates/stream/(?P<stream>[a-z]+)/?$", views.get_unread_status_count),
re_path(
"^api/updates/stream/(?P<stream>[a-z]+)/?$", views.get_unread_status_string
),
# authentication
re_path(r"^login/?$", views.Login.as_view(), name="login"),
re_path(r"^login/(?P<confirmed>confirmed)/?$", views.Login.as_view(), name="login"),
@ -359,16 +361,21 @@ urlpatterns = [
re_path(r"^list/?$", views.Lists.as_view(), name="lists"),
re_path(r"^list/saved/?$", views.SavedLists.as_view(), name="saved-lists"),
re_path(r"^list/(?P<list_id>\d+)(.json)?/?$", views.List.as_view(), name="list"),
re_path(
r"^list/(?P<list_id>\d+)/item/(?P<list_item>\d+)/?$",
views.ListItem.as_view(),
name="list-item",
),
re_path(r"^list/delete/(?P<list_id>\d+)/?$", views.delete_list, name="delete-list"),
re_path(r"^list/add-book/?$", views.list.add_book, name="list-add-book"),
re_path(r"^list/add-book/?$", views.add_book, name="list-add-book"),
re_path(
r"^list/(?P<list_id>\d+)/remove/?$",
views.list.remove_book,
views.remove_book,
name="list-remove-book",
),
re_path(
r"^list-item/(?P<list_item_id>\d+)/set-position$",
views.list.set_book_position,
views.set_book_position,
name="list-set-book-position",
),
re_path(

View file

@ -61,6 +61,21 @@ from .imports.manually_review import (
delete_import_item,
)
# lists
from .list.curate import Curate
from .list.embed import unsafe_embed_list
from .list.list_item import ListItem
from .list.lists import Lists, SavedLists, UserLists
from .list.list import (
List,
save_list,
unsave_list,
delete_list,
add_book,
remove_book,
set_book_position,
)
# misc views
from .author import Author, EditAuthor, update_author_from_remote
from .directory import Directory
@ -90,8 +105,6 @@ from .group import (
from .inbox import Inbox
from .interaction import Favorite, Unfavorite, Boost, Unboost
from .isbn import Isbn
from .list import Lists, SavedLists, List, Curate, UserLists
from .list import save_list, unsave_list, delete_list, unsafe_embed_list
from .notifications import Notifications
from .outbox import Outbox
from .reading import ReadThrough, delete_readthrough, delete_progressupdate
@ -101,7 +114,7 @@ from .rss_feed import RssFeed
from .search import Search
from .status import CreateStatus, EditStatus, DeleteStatus, update_progress
from .status import edit_readthrough
from .updates import get_notification_count, get_unread_status_count
from .updates import get_notification_count, get_unread_status_string
from .user import User, Followers, Following, hide_suggestions, user_redirect
from .wellknown import *
from .annual_summary import (

View file

@ -1,7 +1,6 @@
""" the good people stuff! the authors! """
from django.contrib.auth.decorators import login_required, permission_required
from django.core.paginator import Paginator
from django.db.models import OuterRef, Subquery, F, Q
from django.shortcuts import get_object_or_404, redirect
from django.template.response import TemplateResponse
from django.utils.decorators import method_decorator
@ -12,7 +11,6 @@ from bookwyrm import forms, models
from bookwyrm.activitypub import ActivitypubResponse
from bookwyrm.connectors import connector_manager
from bookwyrm.settings import PAGE_LENGTH
from bookwyrm.utils import cache
from bookwyrm.views.helpers import is_api_request
@ -27,28 +25,9 @@ class Author(View):
if is_api_request(request):
return ActivitypubResponse(author.to_activity())
default_editions = models.Edition.objects.filter(
parent_work=OuterRef("parent_work")
).order_by("-edition_rank")
book_ids = cache.get_or_set(
f"author-books-{author.id}",
lambda a: models.Edition.objects.filter(
Q(authors=a) | Q(parent_work__authors=a)
)
.annotate(default_id=Subquery(default_editions.values("id")[:1]))
.filter(default_id=F("id"))
.distinct()
.values_list("id", flat=True),
author,
timeout=15552000,
)
books = (
models.Edition.objects.filter(id__in=book_ids)
.order_by("-published_date", "-first_published_date", "-created_date")
.prefetch_related("authors")
)
books = models.Work.objects.filter(
authors=author, editions__authors=author
).distinct()
paginated = Paginator(books, PAGE_LENGTH)
page = paginated.get_page(request.GET.get("page"))

View file

@ -62,7 +62,6 @@ class Feed(View):
"streams": STREAMS,
"goal_form": forms.GoalForm(),
"feed_status_types_options": FeedFilterChoices,
"allowed_status_types": request.user.feed_status_types,
"filters_applied": filters_applied,
"path": f"/{tab['key']}",
"annual_summary_year": get_annual_summary_year(),

View file

@ -57,14 +57,7 @@ class GetStartedBooks(View):
if len(book_results) < 5:
popular_books = (
models.Edition.objects.exclude(
# exclude already shelved
Q(
parent_work__in=[
b.book.parent_work
for b in request.user.shelfbook_set.distinct().all()
]
)
| Q( # and exclude if it's already in search results
Q( # exclude if it's already in search results
parent_work__in=[b.parent_work for b in book_results]
)
)

View file

@ -0,0 +1,55 @@
""" book list views"""
from django.contrib.auth.decorators import login_required
from django.db.models import Max
from django.shortcuts import get_object_or_404, redirect
from django.template.response import TemplateResponse
from django.utils.decorators import method_decorator
from django.views import View
from bookwyrm import forms, models
from bookwyrm.views.list.list import increment_order_in_reverse
from bookwyrm.views.list.list import normalize_book_list_ordering
# pylint: disable=no-self-use
@method_decorator(login_required, name="dispatch")
class Curate(View):
"""approve or discard list suggestsions"""
def get(self, request, list_id):
"""display a pending list"""
book_list = get_object_or_404(models.List, id=list_id)
book_list.raise_not_editable(request.user)
data = {
"list": book_list,
"pending": book_list.listitem_set.filter(approved=False),
"list_form": forms.ListForm(instance=book_list),
}
return TemplateResponse(request, "lists/curate.html", data)
def post(self, request, list_id):
"""edit a book_list"""
book_list = get_object_or_404(models.List, id=list_id)
book_list.raise_not_editable(request.user)
suggestion = get_object_or_404(models.ListItem, id=request.POST.get("item"))
approved = request.POST.get("approved") == "true"
if approved:
# update the book and set it to be the last in the order of approved books,
# before any pending books
suggestion.approved = True
order_max = (
book_list.listitem_set.filter(approved=True).aggregate(Max("order"))[
"order__max"
]
or 0
) + 1
suggestion.order = order_max
increment_order_in_reverse(book_list.id, order_max)
suggestion.save()
else:
deleted_order = suggestion.order
suggestion.delete(broadcast=False)
normalize_book_list_ordering(book_list.id, start=deleted_order)
return redirect("list-curate", book_list.id)

View file

@ -0,0 +1,75 @@
""" book list views"""
from django.core.paginator import Paginator
from django.db.models import Avg, DecimalField
from django.db.models.functions import Coalesce
from django.http import Http404
from django.shortcuts import get_object_or_404
from django.template.response import TemplateResponse
from django.views import View
from django.views.decorators.clickjacking import xframe_options_exempt
from bookwyrm import models
from bookwyrm.settings import PAGE_LENGTH
# pylint: disable=no-self-use
class EmbedList(View):
"""embeded book list page"""
def get(self, request, list_id, list_key):
"""display a book list"""
book_list = get_object_or_404(models.List, id=list_id)
embed_key = str(book_list.embed_key.hex)
if list_key != embed_key:
raise Http404()
# sort_by shall be "order" unless a valid alternative is given
sort_by = request.GET.get("sort_by", "order")
if sort_by not in ("order", "title", "rating"):
sort_by = "order"
# direction shall be "ascending" unless a valid alternative is given
direction = request.GET.get("direction", "ascending")
if direction not in ("ascending", "descending"):
direction = "ascending"
directional_sort_by = {
"order": "order",
"title": "book__title",
"rating": "average_rating",
}[sort_by]
if direction == "descending":
directional_sort_by = "-" + directional_sort_by
items = book_list.listitem_set.prefetch_related("user", "book", "book__authors")
if sort_by == "rating":
items = items.annotate(
average_rating=Avg(
Coalesce("book__review__rating", 0.0),
output_field=DecimalField(),
)
)
items = items.filter(approved=True).order_by(directional_sort_by)
paginated = Paginator(items, PAGE_LENGTH)
page = paginated.get_page(request.GET.get("page"))
data = {
"list": book_list,
"items": page,
"page_range": paginated.get_elided_page_range(
page.number, on_each_side=2, on_ends=1
),
}
return TemplateResponse(request, "lists/embed-list.html", data)
@xframe_options_exempt
def unsafe_embed_list(request, *args, **kwargs):
"""allows the EmbedList view to be loaded through unsafe iframe origins"""
embed_list_view = EmbedList.as_view()
return embed_list_view(request, *args, **kwargs)

View file

@ -3,96 +3,26 @@ from typing import Optional
from urllib.parse import urlencode
from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied
from django.core.paginator import Paginator
from django.db import IntegrityError, transaction
from django.db.models import Avg, DecimalField, Q, Max
from django.db.models.functions import Coalesce
from django.http import HttpResponseBadRequest, HttpResponse, Http404
from django.http import HttpResponseBadRequest, HttpResponse
from django.shortcuts import get_object_or_404, redirect
from django.template.response import TemplateResponse
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.http import require_POST
from django.views.decorators.clickjacking import xframe_options_exempt
from bookwyrm import book_search, forms, models
from bookwyrm.activitypub import ActivitypubResponse
from bookwyrm.lists_stream import ListsStream
from bookwyrm.settings import PAGE_LENGTH
from .helpers import is_api_request
from .helpers import get_user_from_username
from bookwyrm.views.helpers import is_api_request
# pylint: disable=no-self-use
class Lists(View):
"""book list page"""
def get(self, request):
"""display a book list"""
lists = ListsStream().get_list_stream(request.user)
paginated = Paginator(lists, 12)
data = {
"lists": paginated.get_page(request.GET.get("page")),
"list_form": forms.ListForm(),
"path": "/list",
}
return TemplateResponse(request, "lists/lists.html", data)
@method_decorator(login_required, name="dispatch")
# pylint: disable=unused-argument
def post(self, request):
"""create a book_list"""
form = forms.ListForm(request.POST)
if not form.is_valid():
return redirect("lists")
book_list = form.save()
# list should not have a group if it is not group curated
if not book_list.curation == "group":
book_list.group = None
book_list.save(broadcast=False)
return redirect(book_list.local_path)
@method_decorator(login_required, name="dispatch")
class SavedLists(View):
"""saved book list page"""
def get(self, request):
"""display book lists"""
# hide lists with no approved books
lists = request.user.saved_lists.order_by("-updated_date")
paginated = Paginator(lists, 12)
data = {
"lists": paginated.get_page(request.GET.get("page")),
"list_form": forms.ListForm(),
"path": "/list",
}
return TemplateResponse(request, "lists/lists.html", data)
@method_decorator(login_required, name="dispatch")
class UserLists(View):
"""a user's book list page"""
def get(self, request, username):
"""display a book list"""
user = get_user_from_username(request.user, username)
lists = models.List.privacy_filter(request.user).filter(user=user)
paginated = Paginator(lists, 12)
data = {
"user": user,
"is_self": request.user.id == user.id,
"lists": paginated.get_page(request.GET.get("page")),
"list_form": forms.ListForm(),
"path": user.local_path + "/lists",
}
return TemplateResponse(request, "user/lists.html", data)
class List(View):
"""book list page"""
@ -191,7 +121,8 @@ class List(View):
form = forms.ListForm(request.POST, instance=book_list)
if not form.is_valid():
return redirect("list", book_list.id)
# this shouldn't happen
raise Exception(form.errors)
book_list = form.save()
if not book_list.curation == "group":
book_list.group = None
@ -200,103 +131,6 @@ class List(View):
return redirect(book_list.local_path)
class EmbedList(View):
"""embeded book list page"""
def get(self, request, list_id, list_key):
"""display a book list"""
book_list = get_object_or_404(models.List, id=list_id)
embed_key = str(book_list.embed_key.hex)
if list_key != embed_key:
raise Http404()
# sort_by shall be "order" unless a valid alternative is given
sort_by = request.GET.get("sort_by", "order")
if sort_by not in ("order", "title", "rating"):
sort_by = "order"
# direction shall be "ascending" unless a valid alternative is given
direction = request.GET.get("direction", "ascending")
if direction not in ("ascending", "descending"):
direction = "ascending"
directional_sort_by = {
"order": "order",
"title": "book__title",
"rating": "average_rating",
}[sort_by]
if direction == "descending":
directional_sort_by = "-" + directional_sort_by
items = book_list.listitem_set.prefetch_related("user", "book", "book__authors")
if sort_by == "rating":
items = items.annotate(
average_rating=Avg(
Coalesce("book__review__rating", 0.0),
output_field=DecimalField(),
)
)
items = items.filter(approved=True).order_by(directional_sort_by)
paginated = Paginator(items, PAGE_LENGTH)
page = paginated.get_page(request.GET.get("page"))
data = {
"list": book_list,
"items": page,
"page_range": paginated.get_elided_page_range(
page.number, on_each_side=2, on_ends=1
),
}
return TemplateResponse(request, "lists/embed-list.html", data)
@method_decorator(login_required, name="dispatch")
class Curate(View):
"""approve or discard list suggestsions"""
def get(self, request, list_id):
"""display a pending list"""
book_list = get_object_or_404(models.List, id=list_id)
book_list.raise_not_editable(request.user)
data = {
"list": book_list,
"pending": book_list.listitem_set.filter(approved=False),
"list_form": forms.ListForm(instance=book_list),
}
return TemplateResponse(request, "lists/curate.html", data)
def post(self, request, list_id):
"""edit a book_list"""
book_list = get_object_or_404(models.List, id=list_id)
book_list.raise_not_editable(request.user)
suggestion = get_object_or_404(models.ListItem, id=request.POST.get("item"))
approved = request.POST.get("approved") == "true"
if approved:
# update the book and set it to be the last in the order of approved books,
# before any pending books
suggestion.approved = True
order_max = (
book_list.listitem_set.filter(approved=True).aggregate(Max("order"))[
"order__max"
]
or 0
) + 1
suggestion.order = order_max
increment_order_in_reverse(book_list.id, order_max)
suggestion.save()
else:
deleted_order = suggestion.order
suggestion.delete(broadcast=False)
normalize_book_list_ordering(book_list.id, start=deleted_order)
return redirect("list-curate", book_list.id)
@require_POST
@login_required
def save_list(request, list_id):
@ -330,53 +164,41 @@ def delete_list(request, list_id):
@require_POST
@login_required
@transaction.atomic
def add_book(request):
"""put a book on a list"""
book_list = get_object_or_404(models.List, id=request.POST.get("list"))
is_group_member = False
if book_list.curation == "group":
is_group_member = models.GroupMember.objects.filter(
group=book_list.group, user=request.user
).exists()
book_list = get_object_or_404(models.List, id=request.POST.get("book_list"))
# make sure the user is allowed to submit to this list
book_list.raise_visible_to_user(request.user)
if request.user != book_list.user and book_list.curation == "closed":
raise PermissionDenied()
is_group_member = models.GroupMember.objects.filter(
group=book_list.group, user=request.user
).exists()
form = forms.ListItemForm(request.POST)
if not form.is_valid():
# this shouldn't happen, there aren't validated fields
raise Exception(form.errors)
item = form.save(commit=False)
if book_list.curation == "curated":
# make a pending entry at the end of the list
order_max = (book_list.listitem_set.aggregate(Max("order"))["order__max"]) or 0
item.approved = is_group_member or request.user == book_list.user
else:
# add the book at the latest order of approved books, before pending books
order_max = (
book_list.listitem_set.filter(approved=True).aggregate(Max("order"))[
"order__max"
]
) or 0
increment_order_in_reverse(book_list.id, order_max + 1)
item.order = order_max + 1
book = get_object_or_404(models.Edition, id=request.POST.get("book"))
# do you have permission to add to the list?
try:
if (
request.user == book_list.user
or is_group_member
or book_list.curation == "open"
):
# add the book at the latest order of approved books, before pending books
order_max = (
book_list.listitem_set.filter(approved=True).aggregate(Max("order"))[
"order__max"
]
) or 0
increment_order_in_reverse(book_list.id, order_max + 1)
models.ListItem.objects.create(
book=book,
book_list=book_list,
user=request.user,
order=order_max + 1,
)
elif book_list.curation == "curated":
# make a pending entry at the end of the list
order_max = (
book_list.listitem_set.aggregate(Max("order"))["order__max"]
) or 0
models.ListItem.objects.create(
approved=False,
book=book,
book_list=book_list,
user=request.user,
order=order_max + 1,
)
else:
# you can't add to this list, what were you THINKING
return HttpResponseBadRequest()
item.save()
except IntegrityError:
# if the book is already on the list, don't flip out
pass
@ -499,11 +321,3 @@ def normalize_book_list_ordering(book_list_id, start=0, add_offset=0):
if item.order != effective_order:
item.order = effective_order
item.save()
@xframe_options_exempt
def unsafe_embed_list(request, *args, **kwargs):
"""allows the EmbedList view to be loaded through unsafe iframe origins"""
embed_list_view = EmbedList.as_view()
return embed_list_view(request, *args, **kwargs)

View file

@ -0,0 +1,22 @@
""" book list views"""
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, redirect
from django.utils.decorators import method_decorator
from django.views import View
from bookwyrm import forms, models
# pylint: disable=no-self-use
@method_decorator(login_required, name="dispatch")
class ListItem(View):
"""book list page"""
def post(self, request, list_id, list_item):
"""Edit a list item's notes"""
list_item = get_object_or_404(models.ListItem, id=list_item, book_list=list_id)
list_item.raise_not_editable(request.user)
form = forms.ListItemForm(request.POST, instance=list_item)
if form.is_valid():
form.save()
return redirect("list", list_item.book_list.id)

View file

@ -0,0 +1,80 @@
""" book list views"""
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator
from django.shortcuts import redirect
from django.template.response import TemplateResponse
from django.utils.decorators import method_decorator
from django.views import View
from bookwyrm import forms, models
from bookwyrm.lists_stream import ListsStream
from bookwyrm.views.helpers import get_user_from_username
# pylint: disable=no-self-use
class Lists(View):
"""book list page"""
def get(self, request):
"""display a book list"""
lists = ListsStream().get_list_stream(request.user)
paginated = Paginator(lists, 12)
data = {
"lists": paginated.get_page(request.GET.get("page")),
"list_form": forms.ListForm(),
"path": "/list",
}
return TemplateResponse(request, "lists/lists.html", data)
@method_decorator(login_required, name="dispatch")
# pylint: disable=unused-argument
def post(self, request):
"""create a book_list"""
form = forms.ListForm(request.POST)
if not form.is_valid():
return redirect("lists")
book_list = form.save()
# list should not have a group if it is not group curated
if not book_list.curation == "group":
book_list.group = None
book_list.save(broadcast=False)
return redirect(book_list.local_path)
@method_decorator(login_required, name="dispatch")
class SavedLists(View):
"""saved book list page"""
def get(self, request):
"""display book lists"""
# hide lists with no approved books
lists = request.user.saved_lists.order_by("-updated_date")
paginated = Paginator(lists, 12)
data = {
"lists": paginated.get_page(request.GET.get("page")),
"list_form": forms.ListForm(),
"path": "/list",
}
return TemplateResponse(request, "lists/lists.html", data)
@method_decorator(login_required, name="dispatch")
class UserLists(View):
"""a user's book list page"""
def get(self, request, username):
"""display a book list"""
user = get_user_from_username(request.user, username)
lists = models.List.privacy_filter(request.user).filter(user=user)
paginated = Paginator(lists, 12)
data = {
"user": user,
"is_self": request.user.id == user.id,
"lists": paginated.get_page(request.GET.get("page")),
"list_form": forms.ListForm(),
"path": user.local_path + "/lists",
}
return TemplateResponse(request, "user/lists.html", data)

View file

@ -4,7 +4,6 @@ from django.contrib.syndication.views import Feed
from django.template.loader import get_template
from django.utils.translation import gettext_lazy as _
from bookwyrm import models
from .helpers import get_user_from_username
# pylint: disable=no-self-use, unused-argument
@ -36,10 +35,9 @@ class RssFeed(Feed):
def items(self, obj):
"""the user's activity feed"""
return models.Status.privacy_filter(
obj,
privacy_levels=["public", "unlisted"],
).filter(user=obj)
return obj.status_set.select_subclasses().filter(
privacy__in=["public", "unlisted"],
)[:10]
def item_link(self, item):
"""link to the status"""

View file

@ -1,7 +1,7 @@
""" shelf views """
from collections import namedtuple
from django.db.models import OuterRef, Subquery, F
from django.db.models import OuterRef, Subquery, F, Max
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator
from django.http import HttpResponseBadRequest
@ -72,11 +72,7 @@ class Shelf(View):
"start_date"
)
if shelf_identifier:
books = books.annotate(shelved_date=F("shelfbook__shelved_date"))
else:
# sorting by shelved date will cause duplicates in the "all books" view
books = books.annotate(shelved_date=F("updated_date"))
books = books.annotate(shelved_date=Max("shelfbook__shelved_date"))
books = books.annotate(
rating=Subquery(reviews.values("rating")[:1]),
start_date=Subquery(reading.values("start_date")[:1]),

View file

@ -1,6 +1,7 @@
""" endpoints for getting updates about activity """
from django.contrib.auth.decorators import login_required
from django.http import Http404, JsonResponse
from django.utils.translation import ngettext
from bookwyrm import activitystreams
@ -17,14 +18,31 @@ def get_notification_count(request):
@login_required
def get_unread_status_count(request, stream="home"):
def get_unread_status_string(request, stream="home"):
"""any unread statuses for this feed?"""
stream = activitystreams.streams.get(stream)
if not stream:
raise Http404
return JsonResponse(
{
"count": stream.get_unread_count(request.user),
"count_by_type": stream.get_unread_count_by_status_type(request.user),
}
)
counts_by_type = stream.get_unread_count_by_status_type(request.user).items()
if counts_by_type == {}:
count = stream.get_unread_count(request.user)
else:
# only consider the types that are visible in the feed
allowed_status_types = request.user.feed_status_types
count = sum(c for (k, c) in counts_by_type if k in allowed_status_types)
# if "everything else" is allowed, add other types to the sum
count += sum(
c
for (k, c) in counts_by_type
if k not in ["review", "comment", "quotation"]
)
if not count:
return JsonResponse({})
translation_string = lambda c: ngettext(
"Load %(count)d unread status", "Load %(count)d unread statuses", c
) % {"count": c}
return JsonResponse({"count": translation_string(count)})

1
bw-dev
View file

@ -119,6 +119,7 @@ case "$CMD" in
git checkout l10n_main locale/no_NO
git checkout l10n_main locale/pt_PT
git checkout l10n_main locale/pt_BR
git checkout l10n_main locale/sv_SE
git checkout l10n_main locale/zh_Hans
git checkout l10n_main locale/zh_Hant
runweb django-admin makemessages --no-wrap --ignore=venv -l en_US $@

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-17 19:26+0000\n"
"PO-Revision-Date: 2022-01-20 08:20\n"
"POT-Creation-Date: 2022-01-20 17:58+0000\n"
"PO-Revision-Date: 2022-01-20 22:34\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: German\n"
"Language: de\n"
@ -56,11 +56,11 @@ msgstr "Buchtitel"
#: bookwyrm/forms.py:485 bookwyrm/templates/shelf/shelf.html:155
#: bookwyrm/templates/shelf/shelf.html:187
#: bookwyrm/templates/snippets/create_status/review.html:33
#: bookwyrm/templates/snippets/create_status/review.html:32
msgid "Rating"
msgstr "Bewertung"
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:134
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:135
msgid "Sort By"
msgstr "Sortieren nach"
@ -224,69 +224,69 @@ msgstr "Zitate"
msgid "Everything else"
msgstr "Alles andere"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home Timeline"
msgstr "Start-Zeitleiste"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home"
msgstr "Startseite"
#: bookwyrm/settings.py:122
#: bookwyrm/settings.py:174
msgid "Books Timeline"
msgstr "Bücher-Zeitleiste"
#: bookwyrm/settings.py:122 bookwyrm/templates/search/layout.html:21
#: bookwyrm/settings.py:174 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Bücher"
#: bookwyrm/settings.py:196
#: bookwyrm/settings.py:248
msgid "English"
msgstr "English (Englisch)"
#: bookwyrm/settings.py:197
#: bookwyrm/settings.py:249
msgid "Deutsch (German)"
msgstr "Deutsch"
#: bookwyrm/settings.py:198
#: bookwyrm/settings.py:250
msgid "Español (Spanish)"
msgstr "Español (Spanisch)"
#: bookwyrm/settings.py:199
#: bookwyrm/settings.py:251
msgid "Galego (Galician)"
msgstr "Galego (Galizisch)"
#: bookwyrm/settings.py:200
#: bookwyrm/settings.py:252
msgid "Italiano (Italian)"
msgstr "Italiano (Italienisch)"
#: bookwyrm/settings.py:201
#: bookwyrm/settings.py:253
msgid "Français (French)"
msgstr "Français (Französisch)"
#: bookwyrm/settings.py:202
#: bookwyrm/settings.py:254
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Litauisch)"
#: bookwyrm/settings.py:203
#: bookwyrm/settings.py:255
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norwegisch)"
#: bookwyrm/settings.py:204
#: bookwyrm/settings.py:256
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (brasilianisches Portugiesisch)"
#: bookwyrm/settings.py:205
#: bookwyrm/settings.py:257
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugiesisch)"
#: bookwyrm/settings.py:206
#: bookwyrm/settings.py:258
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (vereinfachtes Chinesisch)"
#: bookwyrm/settings.py:207
#: bookwyrm/settings.py:259
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinesisch, traditionell)"
@ -351,12 +351,8 @@ msgstr "Lerne deinen Admins kennen"
#: bookwyrm/templates/about/about.html:98
#, python-format
msgid "\n"
" %(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior.\n"
" "
msgstr "\n"
" die Moderator*innen und Administrator*innen von %(site_name)s halten diese Seite in Betrieb, setzen die <a href=\"coc_path\">Verhaltensregeln</a> durch und reagieren auf Meldungen über Spam oder schlechtes Benehmen von Nutzer*innen.\n"
" "
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior."
msgstr ""
#: bookwyrm/templates/about/about.html:112
msgid "Moderator"
@ -428,7 +424,7 @@ msgid "Copy address"
msgstr "Adresse kopieren"
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:230
#: bookwyrm/templates/lists/list.html:231
msgid "Copied!"
msgstr "Kopiert!"
@ -497,7 +493,7 @@ msgstr "Das am schnellsten gelesene Buch dieses Jahr&nbsp;…"
#: bookwyrm/templates/annual_summary/layout.html:245
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "von"
@ -733,9 +729,9 @@ msgstr "Das Laden von Daten wird eine Verbindung zu <strong>%(source_name)s</str
#: bookwyrm/templates/author/sync_modal.html:22
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/book/sync_modal.html:22
#: bookwyrm/templates/groups/members.html:30
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
msgid "Confirm"
msgstr "Bestätigen"
@ -819,8 +815,8 @@ msgid "Places"
msgstr "Orte"
#: bookwyrm/templates/book/book.html:348
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:10
#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:11
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -834,7 +830,7 @@ msgstr "Zur Liste hinzufügen"
#: bookwyrm/templates/book/book.html:369
#: bookwyrm/templates/book/cover_add_modal.html:31
#: bookwyrm/templates/lists/list.html:208
#: bookwyrm/templates/lists/list.html:209
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
msgid "Add"
@ -936,7 +932,7 @@ msgid "Back"
msgstr "Zurück"
#: bookwyrm/templates/book/edit/edit_book_form.html:21
#: bookwyrm/templates/snippets/create_status/review.html:16
#: bookwyrm/templates/snippets/create_status/review.html:15
msgid "Title:"
msgstr "Titel:"
@ -1653,7 +1649,7 @@ msgid "What are you reading?"
msgstr "Was liest du gerade?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:162
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:163
msgid "Search for a book"
msgstr "Nach einem Buch suchen"
@ -1671,9 +1667,9 @@ msgstr "Du kannst Bücher hinzufügen, wenn du %(site_name)s benutzt."
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/groups/members.html:17 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:166
#: bookwyrm/templates/groups/members.html:15
#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1689,7 +1685,7 @@ msgid "Popular on %(site_name)s"
msgstr "Auf %(site_name)s beliebt"
#: bookwyrm/templates/get_started/books.html:58
#: bookwyrm/templates/lists/list.html:179
#: bookwyrm/templates/lists/list.html:180
msgid "No books found"
msgstr "Keine Bücher gefunden"
@ -1794,7 +1790,7 @@ msgstr "Diese Aktion kann nicht rückgängig gemacht werden"
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
#: bookwyrm/templates/snippets/join_invitation_buttons.html:13
#: bookwyrm/templates/snippets/join_invitation_buttons.html:14
msgid "Delete"
msgstr "Löschen"
@ -1814,17 +1810,17 @@ msgstr "Gruppenbeschreibung:"
msgid "Delete group"
msgstr "Gruppe löschen"
#: bookwyrm/templates/groups/group.html:22
#: bookwyrm/templates/groups/group.html:21
msgid "Members of this group can create group-curated lists."
msgstr "Mitglieder dieser Gruppe können von der Gruppe kuratierte Listen anlegen."
#: bookwyrm/templates/groups/group.html:27
#: bookwyrm/templates/groups/group.html:26
#: bookwyrm/templates/lists/create_form.html:5
#: bookwyrm/templates/lists/lists.html:20
msgid "Create List"
msgstr "Liste erstellen"
#: bookwyrm/templates/groups/group.html:40
#: bookwyrm/templates/groups/group.html:39
msgid "This group has no lists"
msgstr "Diese Gruppe enthält keine Listen"
@ -1832,15 +1828,15 @@ msgstr "Diese Gruppe enthält keine Listen"
msgid "Edit group"
msgstr "Gruppe bearbeiten"
#: bookwyrm/templates/groups/members.html:12
#: bookwyrm/templates/groups/members.html:11
msgid "Search to add a user"
msgstr "Hinzuzufügende*n Benutzer*in suchen"
#: bookwyrm/templates/groups/members.html:33
#: bookwyrm/templates/groups/members.html:32
msgid "Leave group"
msgstr "Gruppe verlassen"
#: bookwyrm/templates/groups/members.html:55
#: bookwyrm/templates/groups/members.html:54
#: bookwyrm/templates/groups/suggested_users.html:35
#: bookwyrm/templates/snippets/suggested_users.html:31
#: bookwyrm/templates/user/user_preview.html:36
@ -2297,18 +2293,18 @@ msgstr "Diese Liste löschen?"
msgid "Edit List"
msgstr "Liste bearbeiten"
#: bookwyrm/templates/lists/embed-list.html:7
#: bookwyrm/templates/lists/embed-list.html:8
#, python-format
msgid "%(list_name)s, a list by %(owner)s"
msgstr "%(list_name)s, eine Liste von %(owner)s"
#: bookwyrm/templates/lists/embed-list.html:17
#: bookwyrm/templates/lists/embed-list.html:18
#, python-format
msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr "auf <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:42
#: bookwyrm/templates/lists/embed-list.html:27
#: bookwyrm/templates/lists/list.html:43
msgid "This list is currently empty"
msgstr "Diese Liste ist momentan leer"
@ -2369,76 +2365,76 @@ msgstr "Gruppe erstellen"
msgid "Delete list"
msgstr "Liste löschen"
#: bookwyrm/templates/lists/list.html:34
#: bookwyrm/templates/lists/list.html:35
msgid "You successfully suggested a book for this list!"
msgstr "Dein Buchvorschlag wurde dieser Liste hinzugefügt!"
#: bookwyrm/templates/lists/list.html:36
#: bookwyrm/templates/lists/list.html:37
msgid "You successfully added a book to this list!"
msgstr "Du hast ein Buch zu dieser Liste hinzugefügt!"
#: bookwyrm/templates/lists/list.html:80
#: bookwyrm/templates/lists/list.html:81
#, python-format
msgid "Added by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "Hinzugefügt von <a href=\"%(user_path)s\">%(username)s</a>"
#: bookwyrm/templates/lists/list.html:95
#: bookwyrm/templates/lists/list.html:96
msgid "List position"
msgstr "Listenposition"
#: bookwyrm/templates/lists/list.html:101
#: bookwyrm/templates/lists/list.html:102
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
msgid "Set"
msgstr "Übernehmen"
#: bookwyrm/templates/lists/list.html:116
#: bookwyrm/templates/snippets/remove_from_group_button.html:19
#: bookwyrm/templates/lists/list.html:117
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr "Entfernen"
#: bookwyrm/templates/lists/list.html:130
#: bookwyrm/templates/lists/list.html:147
#: bookwyrm/templates/lists/list.html:131
#: bookwyrm/templates/lists/list.html:148
msgid "Sort List"
msgstr "Liste sortieren"
#: bookwyrm/templates/lists/list.html:140
#: bookwyrm/templates/lists/list.html:141
msgid "Direction"
msgstr "Reihenfolge"
#: bookwyrm/templates/lists/list.html:154
#: bookwyrm/templates/lists/list.html:155
msgid "Add Books"
msgstr "Bücher hinzufügen"
#: bookwyrm/templates/lists/list.html:156
#: bookwyrm/templates/lists/list.html:157
msgid "Suggest Books"
msgstr "Bücher vorschlagen"
#: bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/lists/list.html:168
msgid "search"
msgstr "suchen"
#: bookwyrm/templates/lists/list.html:173
#: bookwyrm/templates/lists/list.html:174
msgid "Clear search"
msgstr "Suche zurücksetzen"
#: bookwyrm/templates/lists/list.html:178
#: bookwyrm/templates/lists/list.html:179
#, python-format
msgid "No books found matching the query \"%(query)s\""
msgstr "Keine passenden Bücher zu „%(query)s“ gefunden"
#: bookwyrm/templates/lists/list.html:210
#: bookwyrm/templates/lists/list.html:211
msgid "Suggest"
msgstr "Vorschlagen"
#: bookwyrm/templates/lists/list.html:221
#: bookwyrm/templates/lists/list.html:222
msgid "Embed this list on a website"
msgstr "Diese Liste auf einer Webseite einbetten"
#: bookwyrm/templates/lists/list.html:229
#: bookwyrm/templates/lists/list.html:230
msgid "Copy embed code"
msgstr "Code zum einbetten kopieren"
#: bookwyrm/templates/lists/list.html:231
#: bookwyrm/templates/lists/list.html:232
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr "%(list_name)s, eine Liste von %(owner)s auf %(site_name)s"
@ -3914,15 +3910,15 @@ msgstr "Abgeschlossen"
msgid "This shelf is empty."
msgstr "Dieses Regal ist leer."
#: bookwyrm/templates/snippets/add_to_group_button.html:15
#: bookwyrm/templates/snippets/add_to_group_button.html:16
msgid "Invite"
msgstr "Einladen"
#: bookwyrm/templates/snippets/add_to_group_button.html:24
#: bookwyrm/templates/snippets/add_to_group_button.html:25
msgid "Uninvite"
msgstr "Einladung stornieren"
#: bookwyrm/templates/snippets/add_to_group_button.html:28
#: bookwyrm/templates/snippets/add_to_group_button.html:29
#, python-format
msgid "Remove @%(username)s"
msgstr "@%(username)s entfernen"
@ -4010,7 +4006,7 @@ msgstr "Spoileralarm!"
msgid "Include spoiler alert"
msgstr "Spoileralarm aktivieren"
#: bookwyrm/templates/snippets/create_status/layout.html:48
#: bookwyrm/templates/snippets/create_status/layout.html:47
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Kommentar:"
@ -4019,33 +4015,33 @@ msgstr "Kommentar:"
msgid "Post"
msgstr "Veröffentlichen"
#: bookwyrm/templates/snippets/create_status/quotation.html:17
#: bookwyrm/templates/snippets/create_status/quotation.html:16
msgid "Quote:"
msgstr "Zitat:"
#: bookwyrm/templates/snippets/create_status/quotation.html:25
#: bookwyrm/templates/snippets/create_status/quotation.html:24
#, python-format
msgid "An excerpt from '%(book_title)s'"
msgstr "Ein Auszug aus „%(book_title)s“"
#: bookwyrm/templates/snippets/create_status/quotation.html:32
#: bookwyrm/templates/snippets/create_status/quotation.html:31
msgid "Position:"
msgstr "Position:"
#: bookwyrm/templates/snippets/create_status/quotation.html:45
#: bookwyrm/templates/snippets/create_status/quotation.html:44
msgid "On page:"
msgstr "Auf Seite:"
#: bookwyrm/templates/snippets/create_status/quotation.html:51
#: bookwyrm/templates/snippets/create_status/quotation.html:50
msgid "At percent:"
msgstr "Bei Prozentsatz:"
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/snippets/create_status/review.html:24
#, python-format
msgid "Your review of '%(book_title)s'"
msgstr "Deine Besprechung von „%(book_title)s“"
#: bookwyrm/templates/snippets/create_status/review.html:40
#: bookwyrm/templates/snippets/create_status/review.html:39
msgid "Review:"
msgstr "Besprechung:"
@ -4099,7 +4095,7 @@ msgid "Unfollow"
msgstr "Entfolgen"
#: bookwyrm/templates/snippets/follow_request_buttons.html:7
#: bookwyrm/templates/snippets/join_invitation_buttons.html:8
#: bookwyrm/templates/snippets/join_invitation_buttons.html:9
msgid "Accept"
msgstr "Annehmen"
@ -4139,15 +4135,15 @@ msgstr[1] "hat <em><a href=\"%(path)s\">%(title)s</a></em> mit %(display_rating)
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] "Besprechung von „<a href='%(book_path)s'>%(book_title)s</a>“ (%(display_rating)s Stern): %(review_title)s"
msgstr[1] "Besprechungen von „<a href='%(book_path)s'>%(book_title)s</a>“ (%(display_rating)s Stern): %(review_title)s"
msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:12
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\": %(review_title)s"
msgstr "Besprechung von „<a href='%(book_path)s'>%(book_title)s</a>: %(review_title)s"
msgid "Review of \"%(book_title)s\": %(review_title)s"
msgstr ""
#: bookwyrm/templates/snippets/goal_form.html:4
#, python-format
@ -4217,11 +4213,11 @@ msgstr "Nur für Follower*innen"
msgid "Post privacy"
msgstr "Beitragssichtbarkeit"
#: bookwyrm/templates/snippets/rate_action.html:4
#: bookwyrm/templates/snippets/rate_action.html:5
msgid "Leave a rating"
msgstr "Bewerten"
#: bookwyrm/templates/snippets/rate_action.html:19
#: bookwyrm/templates/snippets/rate_action.html:20
msgid "Rate"
msgstr "Bewerten"
@ -4315,29 +4311,29 @@ msgstr "Aus %(name)s entfernen"
msgid "Finish reading"
msgstr "Lesen abschließen"
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/status/content_status.html:73
msgid "Content warning"
msgstr "Inhaltswarnung"
#: bookwyrm/templates/snippets/status/content_status.html:79
#: bookwyrm/templates/snippets/status/content_status.html:80
msgid "Show status"
msgstr "Status anzeigen"
#: bookwyrm/templates/snippets/status/content_status.html:101
#: bookwyrm/templates/snippets/status/content_status.html:102
#, python-format
msgid "(Page %(page)s)"
msgstr "(Seite %(page)s)"
#: bookwyrm/templates/snippets/status/content_status.html:103
#: bookwyrm/templates/snippets/status/content_status.html:104
#, python-format
msgid "(%(percent)s%%)"
msgstr "(%(percent)s%%)"
#: bookwyrm/templates/snippets/status/content_status.html:125
#: bookwyrm/templates/snippets/status/content_status.html:126
msgid "Open image in new window"
msgstr "Bild in neuem Fenster öffnen"
#: bookwyrm/templates/snippets/status/content_status.html:144
#: bookwyrm/templates/snippets/status/content_status.html:145
msgid "Hide status"
msgstr "Status ausblenden"

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-20 17:58+0000\n"
"POT-Creation-Date: 2022-01-24 17:25+0000\n"
"PO-Revision-Date: 2021-02-28 17:19-0800\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: English <LL@li.org>\n"
@ -316,54 +316,54 @@ msgstr ""
msgid "About"
msgstr ""
#: bookwyrm/templates/about/about.html:18
#: bookwyrm/templates/about/about.html:19
#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr ""
#: bookwyrm/templates/about/about.html:22
#: bookwyrm/templates/about/about.html:23
#, python-format
msgid "%(site_name)s is part of <em>BookWyrm</em>, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the <a href=\"https://joinbookwyrm.com/instances/\" target=\"_blank\">BookWyrm network</a>, this community is unique."
msgstr ""
#: bookwyrm/templates/about/about.html:39
#: bookwyrm/templates/about/about.html:40
#, python-format
msgid "<a href=\"%(book_path)s\"><em>%(title)s</em></a> is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
msgstr ""
#: bookwyrm/templates/about/about.html:58
#: bookwyrm/templates/about/about.html:59
#, python-format
msgid "More %(site_name)s users want to read <a href=\"%(book_path)s\"><em>%(title)s</em></a> than any other book."
msgstr ""
#: bookwyrm/templates/about/about.html:77
#: bookwyrm/templates/about/about.html:78
#, python-format
msgid "<a href=\"%(book_path)s\"><em>%(title)s</em></a> has the most divisive ratings of any book on %(site_name)s."
msgstr ""
#: bookwyrm/templates/about/about.html:88
#: bookwyrm/templates/about/about.html:89
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, <a href='https://joinbookwyrm.com/get-involved' target='_blank'>reach out</a> and make yourself heard."
msgstr ""
#: bookwyrm/templates/about/about.html:95
#: bookwyrm/templates/about/about.html:96
msgid "Meet your admins"
msgstr ""
#: bookwyrm/templates/about/about.html:98
#: bookwyrm/templates/about/about.html:99
#, python-format
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior."
msgstr ""
#: bookwyrm/templates/about/about.html:112
#: bookwyrm/templates/about/about.html:113
msgid "Moderator"
msgstr ""
#: bookwyrm/templates/about/about.html:114 bookwyrm/templates/layout.html:131
#: bookwyrm/templates/about/about.html:115 bookwyrm/templates/layout.html:131
msgid "Admin"
msgstr ""
#: bookwyrm/templates/about/about.html:130
#: bookwyrm/templates/about/about.html:131
#: bookwyrm/templates/settings/users/user_moderation_actions.html:14
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:13
@ -4626,7 +4626,7 @@ msgstr ""
msgid "A password reset link was sent to {email}"
msgstr ""
#: bookwyrm/views/rss_feed.py:35
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
msgstr ""

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-17 19:26+0000\n"
"PO-Revision-Date: 2022-01-17 20:55\n"
"POT-Creation-Date: 2022-01-20 17:58+0000\n"
"PO-Revision-Date: 2022-01-20 22:34\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Spanish\n"
"Language: es\n"
@ -56,11 +56,11 @@ msgstr "Título"
#: bookwyrm/forms.py:485 bookwyrm/templates/shelf/shelf.html:155
#: bookwyrm/templates/shelf/shelf.html:187
#: bookwyrm/templates/snippets/create_status/review.html:33
#: bookwyrm/templates/snippets/create_status/review.html:32
msgid "Rating"
msgstr "Valoración"
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:134
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:135
msgid "Sort By"
msgstr "Ordenar por"
@ -224,69 +224,69 @@ msgstr "Citas"
msgid "Everything else"
msgstr "Todo lo demás"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home Timeline"
msgstr "Línea de tiempo principal"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home"
msgstr "Inicio"
#: bookwyrm/settings.py:122
#: bookwyrm/settings.py:174
msgid "Books Timeline"
msgstr "Línea temporal de libros"
#: bookwyrm/settings.py:122 bookwyrm/templates/search/layout.html:21
#: bookwyrm/settings.py:174 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Libros"
#: bookwyrm/settings.py:196
#: bookwyrm/settings.py:248
msgid "English"
msgstr "English (Inglés)"
#: bookwyrm/settings.py:197
#: bookwyrm/settings.py:249
msgid "Deutsch (German)"
msgstr "Deutsch (Alemán)"
#: bookwyrm/settings.py:198
#: bookwyrm/settings.py:250
msgid "Español (Spanish)"
msgstr "Español"
#: bookwyrm/settings.py:199
#: bookwyrm/settings.py:251
msgid "Galego (Galician)"
msgstr "Galego (Gallego)"
#: bookwyrm/settings.py:200
#: bookwyrm/settings.py:252
msgid "Italiano (Italian)"
msgstr "Italiano"
#: bookwyrm/settings.py:201
#: bookwyrm/settings.py:253
msgid "Français (French)"
msgstr "Français (Francés)"
#: bookwyrm/settings.py:202
#: bookwyrm/settings.py:254
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituano)"
#: bookwyrm/settings.py:203
#: bookwyrm/settings.py:255
msgid "Norsk (Norwegian)"
msgstr "Norsk (Noruego)"
#: bookwyrm/settings.py:204
#: bookwyrm/settings.py:256
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugués brasileño)"
#: bookwyrm/settings.py:205
#: bookwyrm/settings.py:257
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugués europeo)"
#: bookwyrm/settings.py:206
#: bookwyrm/settings.py:258
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chino simplificado)"
#: bookwyrm/settings.py:207
#: bookwyrm/settings.py:259
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chino tradicional)"
@ -351,12 +351,8 @@ msgstr "Conoce a tus administradores"
#: bookwyrm/templates/about/about.html:98
#, python-format
msgid "\n"
" %(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior.\n"
" "
msgstr "\n"
" Los moderadores y administradores de %(site_name)s mantienen el sitio en funcionamiento, hacen cumplir el <a href=\"coc_path\">código de conducta</a> y responden cuando los usuarios reportan spam y mal comportamiento.\n"
" "
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior."
msgstr ""
#: bookwyrm/templates/about/about.html:112
msgid "Moderator"
@ -428,7 +424,7 @@ msgid "Copy address"
msgstr "Copiar dirección"
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:230
#: bookwyrm/templates/lists/list.html:231
msgid "Copied!"
msgstr "¡Copiado!"
@ -497,7 +493,7 @@ msgstr "Su lectura más corta de este año…"
#: bookwyrm/templates/annual_summary/layout.html:245
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "por"
@ -733,9 +729,9 @@ msgstr "La carga de datos se conectará a <strong>%(source_name)s</strong> y com
#: bookwyrm/templates/author/sync_modal.html:22
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/book/sync_modal.html:22
#: bookwyrm/templates/groups/members.html:30
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
msgid "Confirm"
msgstr "Confirmar"
@ -819,8 +815,8 @@ msgid "Places"
msgstr "Lugares"
#: bookwyrm/templates/book/book.html:348
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:10
#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:11
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -834,7 +830,7 @@ msgstr "Agregar a lista"
#: bookwyrm/templates/book/book.html:369
#: bookwyrm/templates/book/cover_add_modal.html:31
#: bookwyrm/templates/lists/list.html:208
#: bookwyrm/templates/lists/list.html:209
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
msgid "Add"
@ -936,7 +932,7 @@ msgid "Back"
msgstr "Volver"
#: bookwyrm/templates/book/edit/edit_book_form.html:21
#: bookwyrm/templates/snippets/create_status/review.html:16
#: bookwyrm/templates/snippets/create_status/review.html:15
msgid "Title:"
msgstr "Título:"
@ -1653,7 +1649,7 @@ msgid "What are you reading?"
msgstr "¿Qué estás leyendo?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:162
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:163
msgid "Search for a book"
msgstr "Buscar libros"
@ -1671,9 +1667,9 @@ msgstr "Puedes agregar libros cuando comiences a usar %(site_name)s."
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/groups/members.html:17 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:166
#: bookwyrm/templates/groups/members.html:15
#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1689,7 +1685,7 @@ msgid "Popular on %(site_name)s"
msgstr "Popular en %(site_name)s"
#: bookwyrm/templates/get_started/books.html:58
#: bookwyrm/templates/lists/list.html:179
#: bookwyrm/templates/lists/list.html:180
msgid "No books found"
msgstr "No se encontró ningún libro"
@ -1794,7 +1790,7 @@ msgstr "Esta acción no se puede deshacer"
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
#: bookwyrm/templates/snippets/join_invitation_buttons.html:13
#: bookwyrm/templates/snippets/join_invitation_buttons.html:14
msgid "Delete"
msgstr "Eliminar"
@ -1814,17 +1810,17 @@ msgstr "Descripción del grupo:"
msgid "Delete group"
msgstr "Eliminar grupo"
#: bookwyrm/templates/groups/group.html:22
#: bookwyrm/templates/groups/group.html:21
msgid "Members of this group can create group-curated lists."
msgstr "Los miembros de este grupo pueden crear listas comisariadas en grupo."
#: bookwyrm/templates/groups/group.html:27
#: bookwyrm/templates/groups/group.html:26
#: bookwyrm/templates/lists/create_form.html:5
#: bookwyrm/templates/lists/lists.html:20
msgid "Create List"
msgstr "Crear lista"
#: bookwyrm/templates/groups/group.html:40
#: bookwyrm/templates/groups/group.html:39
msgid "This group has no lists"
msgstr "Este grupo no tiene listas"
@ -1832,15 +1828,15 @@ msgstr "Este grupo no tiene listas"
msgid "Edit group"
msgstr "Editar grupo"
#: bookwyrm/templates/groups/members.html:12
#: bookwyrm/templates/groups/members.html:11
msgid "Search to add a user"
msgstr "Buscar para agregar un usuario"
#: bookwyrm/templates/groups/members.html:33
#: bookwyrm/templates/groups/members.html:32
msgid "Leave group"
msgstr "Dejar grupo"
#: bookwyrm/templates/groups/members.html:55
#: bookwyrm/templates/groups/members.html:54
#: bookwyrm/templates/groups/suggested_users.html:35
#: bookwyrm/templates/snippets/suggested_users.html:31
#: bookwyrm/templates/user/user_preview.html:36
@ -2297,18 +2293,18 @@ msgstr "¿Eliminar esta lista?"
msgid "Edit List"
msgstr "Editar lista"
#: bookwyrm/templates/lists/embed-list.html:7
#: bookwyrm/templates/lists/embed-list.html:8
#, python-format
msgid "%(list_name)s, a list by %(owner)s"
msgstr "%(list_name)s, una lista de %(owner)s"
#: bookwyrm/templates/lists/embed-list.html:17
#: bookwyrm/templates/lists/embed-list.html:18
#, python-format
msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr "en <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:42
#: bookwyrm/templates/lists/embed-list.html:27
#: bookwyrm/templates/lists/list.html:43
msgid "This list is currently empty"
msgstr "Esta lista está vacia"
@ -2369,76 +2365,76 @@ msgstr "Crear un grupo"
msgid "Delete list"
msgstr "Eliminar lista"
#: bookwyrm/templates/lists/list.html:34
#: bookwyrm/templates/lists/list.html:35
msgid "You successfully suggested a book for this list!"
msgstr "¡Has sugerido un libro para esta lista exitosamente!"
#: bookwyrm/templates/lists/list.html:36
#: bookwyrm/templates/lists/list.html:37
msgid "You successfully added a book to this list!"
msgstr "¡Has agregado un libro a esta lista exitosamente!"
#: bookwyrm/templates/lists/list.html:80
#: bookwyrm/templates/lists/list.html:81
#, python-format
msgid "Added by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "Agregado por <a href=\"%(user_path)s\">%(username)s</a>"
#: bookwyrm/templates/lists/list.html:95
#: bookwyrm/templates/lists/list.html:96
msgid "List position"
msgstr "Posición"
#: bookwyrm/templates/lists/list.html:101
#: bookwyrm/templates/lists/list.html:102
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
msgid "Set"
msgstr "Establecido"
#: bookwyrm/templates/lists/list.html:116
#: bookwyrm/templates/snippets/remove_from_group_button.html:19
#: bookwyrm/templates/lists/list.html:117
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr "Quitar"
#: bookwyrm/templates/lists/list.html:130
#: bookwyrm/templates/lists/list.html:147
#: bookwyrm/templates/lists/list.html:131
#: bookwyrm/templates/lists/list.html:148
msgid "Sort List"
msgstr "Ordena la lista"
#: bookwyrm/templates/lists/list.html:140
#: bookwyrm/templates/lists/list.html:141
msgid "Direction"
msgstr "Dirección"
#: bookwyrm/templates/lists/list.html:154
#: bookwyrm/templates/lists/list.html:155
msgid "Add Books"
msgstr "Agregar libros"
#: bookwyrm/templates/lists/list.html:156
#: bookwyrm/templates/lists/list.html:157
msgid "Suggest Books"
msgstr "Sugerir libros"
#: bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/lists/list.html:168
msgid "search"
msgstr "buscar"
#: bookwyrm/templates/lists/list.html:173
#: bookwyrm/templates/lists/list.html:174
msgid "Clear search"
msgstr "Borrar búsqueda"
#: bookwyrm/templates/lists/list.html:178
#: bookwyrm/templates/lists/list.html:179
#, python-format
msgid "No books found matching the query \"%(query)s\""
msgstr "No se encontró ningún libro correspondiente a la búsqueda: \"%(query)s\""
#: bookwyrm/templates/lists/list.html:210
#: bookwyrm/templates/lists/list.html:211
msgid "Suggest"
msgstr "Sugerir"
#: bookwyrm/templates/lists/list.html:221
#: bookwyrm/templates/lists/list.html:222
msgid "Embed this list on a website"
msgstr "Incrustar esta lista en un sitio web"
#: bookwyrm/templates/lists/list.html:229
#: bookwyrm/templates/lists/list.html:230
msgid "Copy embed code"
msgstr "Copiar código para incrustar"
#: bookwyrm/templates/lists/list.html:231
#: bookwyrm/templates/lists/list.html:232
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr "%(list_name)s, una lista de %(owner)s en %(site_name)s"
@ -3914,15 +3910,15 @@ msgstr "Terminado"
msgid "This shelf is empty."
msgstr "Esta estantería está vacía."
#: bookwyrm/templates/snippets/add_to_group_button.html:15
#: bookwyrm/templates/snippets/add_to_group_button.html:16
msgid "Invite"
msgstr "Invitar"
#: bookwyrm/templates/snippets/add_to_group_button.html:24
#: bookwyrm/templates/snippets/add_to_group_button.html:25
msgid "Uninvite"
msgstr "Anular la invitación"
#: bookwyrm/templates/snippets/add_to_group_button.html:28
#: bookwyrm/templates/snippets/add_to_group_button.html:29
#, python-format
msgid "Remove @%(username)s"
msgstr "Eliminar a @%(username)s"
@ -4010,7 +4006,7 @@ msgstr "¡Advertencia, ya vienen spoilers!"
msgid "Include spoiler alert"
msgstr "Incluir alerta de spoiler"
#: bookwyrm/templates/snippets/create_status/layout.html:48
#: bookwyrm/templates/snippets/create_status/layout.html:47
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Comentario:"
@ -4019,33 +4015,33 @@ msgstr "Comentario:"
msgid "Post"
msgstr "Compartir"
#: bookwyrm/templates/snippets/create_status/quotation.html:17
#: bookwyrm/templates/snippets/create_status/quotation.html:16
msgid "Quote:"
msgstr "Cita:"
#: bookwyrm/templates/snippets/create_status/quotation.html:25
#: bookwyrm/templates/snippets/create_status/quotation.html:24
#, python-format
msgid "An excerpt from '%(book_title)s'"
msgstr "Un extracto de '%(book_title)s'"
#: bookwyrm/templates/snippets/create_status/quotation.html:32
#: bookwyrm/templates/snippets/create_status/quotation.html:31
msgid "Position:"
msgstr "Posición:"
#: bookwyrm/templates/snippets/create_status/quotation.html:45
#: bookwyrm/templates/snippets/create_status/quotation.html:44
msgid "On page:"
msgstr "En la página:"
#: bookwyrm/templates/snippets/create_status/quotation.html:51
#: bookwyrm/templates/snippets/create_status/quotation.html:50
msgid "At percent:"
msgstr "Al por ciento:"
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/snippets/create_status/review.html:24
#, python-format
msgid "Your review of '%(book_title)s'"
msgstr "Tu reseña de '%(book_title)s'"
#: bookwyrm/templates/snippets/create_status/review.html:40
#: bookwyrm/templates/snippets/create_status/review.html:39
msgid "Review:"
msgstr "Reseña:"
@ -4099,7 +4095,7 @@ msgid "Unfollow"
msgstr "Dejar de seguir"
#: bookwyrm/templates/snippets/follow_request_buttons.html:7
#: bookwyrm/templates/snippets/join_invitation_buttons.html:8
#: bookwyrm/templates/snippets/join_invitation_buttons.html:9
msgid "Accept"
msgstr "Aceptar"
@ -4139,15 +4135,15 @@ msgstr[1] "valoró <em><a href=\"%(path)s\">%(title)s</a></em>: %(display_rating
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] "Reseña de «<a href='%(book_path)s'>%(book_title)s</a>» (%(display_rating)s estrella): %(review_title)s"
msgstr[1] "Reseña de «<a href='%(book_path)s'>%(book_title)s</a>» (%(display_rating)s estrellas): %(review_title)s"
msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:12
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\": %(review_title)s"
msgstr "Reseña de «<a href='%(book_path)s'>%(book_title)s</a>»: %(review_title)s"
msgid "Review of \"%(book_title)s\": %(review_title)s"
msgstr ""
#: bookwyrm/templates/snippets/goal_form.html:4
#, python-format
@ -4217,11 +4213,11 @@ msgstr "Solo seguidores"
msgid "Post privacy"
msgstr "Privacidad de publicación"
#: bookwyrm/templates/snippets/rate_action.html:4
#: bookwyrm/templates/snippets/rate_action.html:5
msgid "Leave a rating"
msgstr "Da una valoración"
#: bookwyrm/templates/snippets/rate_action.html:19
#: bookwyrm/templates/snippets/rate_action.html:20
msgid "Rate"
msgstr "Valorar"
@ -4315,29 +4311,29 @@ msgstr "Quitar de %(name)s"
msgid "Finish reading"
msgstr "Terminar de leer"
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/status/content_status.html:73
msgid "Content warning"
msgstr "Advertencia de contenido"
#: bookwyrm/templates/snippets/status/content_status.html:79
#: bookwyrm/templates/snippets/status/content_status.html:80
msgid "Show status"
msgstr "Mostrar estado"
#: bookwyrm/templates/snippets/status/content_status.html:101
#: bookwyrm/templates/snippets/status/content_status.html:102
#, python-format
msgid "(Page %(page)s)"
msgstr "(Página %(page)s)"
#: bookwyrm/templates/snippets/status/content_status.html:103
#: bookwyrm/templates/snippets/status/content_status.html:104
#, python-format
msgid "(%(percent)s%%)"
msgstr "(%(percent)s%%)"
#: bookwyrm/templates/snippets/status/content_status.html:125
#: bookwyrm/templates/snippets/status/content_status.html:126
msgid "Open image in new window"
msgstr "Abrir imagen en una nueva ventana"
#: bookwyrm/templates/snippets/status/content_status.html:144
#: bookwyrm/templates/snippets/status/content_status.html:145
msgid "Hide status"
msgstr "Ocultar estado"

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-17 19:26+0000\n"
"PO-Revision-Date: 2022-01-17 20:55\n"
"POT-Creation-Date: 2022-01-20 17:58+0000\n"
"PO-Revision-Date: 2022-01-20 22:35\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: French\n"
"Language: fr\n"
@ -56,11 +56,11 @@ msgstr "Titre du livre"
#: bookwyrm/forms.py:485 bookwyrm/templates/shelf/shelf.html:155
#: bookwyrm/templates/shelf/shelf.html:187
#: bookwyrm/templates/snippets/create_status/review.html:33
#: bookwyrm/templates/snippets/create_status/review.html:32
msgid "Rating"
msgstr "Note"
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:134
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:135
msgid "Sort By"
msgstr "Trier par"
@ -224,69 +224,69 @@ msgstr "Citations"
msgid "Everything else"
msgstr "Tout le reste"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home Timeline"
msgstr "Mon fil dactualité"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home"
msgstr "Accueil"
#: bookwyrm/settings.py:122
#: bookwyrm/settings.py:174
msgid "Books Timeline"
msgstr "Actualité de mes livres"
#: bookwyrm/settings.py:122 bookwyrm/templates/search/layout.html:21
#: bookwyrm/settings.py:174 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Livres"
#: bookwyrm/settings.py:196
#: bookwyrm/settings.py:248
msgid "English"
msgstr "English"
#: bookwyrm/settings.py:197
#: bookwyrm/settings.py:249
msgid "Deutsch (German)"
msgstr "Deutsch"
#: bookwyrm/settings.py:198
#: bookwyrm/settings.py:250
msgid "Español (Spanish)"
msgstr "Español"
#: bookwyrm/settings.py:199
#: bookwyrm/settings.py:251
msgid "Galego (Galician)"
msgstr "Galego (Galicien)"
#: bookwyrm/settings.py:200
#: bookwyrm/settings.py:252
msgid "Italiano (Italian)"
msgstr "Italiano (italien)"
#: bookwyrm/settings.py:201
#: bookwyrm/settings.py:253
msgid "Français (French)"
msgstr "Français"
#: bookwyrm/settings.py:202
#: bookwyrm/settings.py:254
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituanien)"
#: bookwyrm/settings.py:203
#: bookwyrm/settings.py:255
msgid "Norsk (Norwegian)"
msgstr "Norsk (norvégien)"
#: bookwyrm/settings.py:204
#: bookwyrm/settings.py:256
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugais brésilien)"
#: bookwyrm/settings.py:205
#: bookwyrm/settings.py:257
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugais européen)"
#: bookwyrm/settings.py:206
#: bookwyrm/settings.py:258
msgid "简体中文 (Simplified Chinese)"
msgstr "简化字"
#: bookwyrm/settings.py:207
#: bookwyrm/settings.py:259
msgid "繁體中文 (Traditional Chinese)"
msgstr "Infos supplémentaires:"
@ -351,12 +351,8 @@ msgstr "Rencontrez vos admins"
#: bookwyrm/templates/about/about.html:98
#, python-format
msgid "\n"
" %(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior.\n"
" "
msgstr "\n"
" Les admins et modérateurs/modératrices de %(site_name)s maintiennent le site opérationnel, font respecter le <a href=\"coc_path\">code de conduite</a>, et répondent lorsque les utilisateurs signalent spam et mauvais comportements.\n"
" "
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior."
msgstr ""
#: bookwyrm/templates/about/about.html:112
msgid "Moderator"
@ -428,7 +424,7 @@ msgid "Copy address"
msgstr "Copier ladresse"
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:230
#: bookwyrm/templates/lists/list.html:231
msgid "Copied!"
msgstr "Copié!"
@ -497,7 +493,7 @@ msgstr "Sa lecture la plus courte lannée…"
#: bookwyrm/templates/annual_summary/layout.html:245
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "de"
@ -733,9 +729,9 @@ msgstr "Le chargement des données se connectera à <strong>%(source_name)s</str
#: bookwyrm/templates/author/sync_modal.html:22
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/book/sync_modal.html:22
#: bookwyrm/templates/groups/members.html:30
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
msgid "Confirm"
msgstr "Confirmer"
@ -819,8 +815,8 @@ msgid "Places"
msgstr "Lieux"
#: bookwyrm/templates/book/book.html:348
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:10
#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:11
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -834,7 +830,7 @@ msgstr "Ajouter à la liste"
#: bookwyrm/templates/book/book.html:369
#: bookwyrm/templates/book/cover_add_modal.html:31
#: bookwyrm/templates/lists/list.html:208
#: bookwyrm/templates/lists/list.html:209
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
msgid "Add"
@ -936,7 +932,7 @@ msgid "Back"
msgstr "Retour"
#: bookwyrm/templates/book/edit/edit_book_form.html:21
#: bookwyrm/templates/snippets/create_status/review.html:16
#: bookwyrm/templates/snippets/create_status/review.html:15
msgid "Title:"
msgstr "Titre:"
@ -1653,7 +1649,7 @@ msgid "What are you reading?"
msgstr "Que lisezvous?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:162
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:163
msgid "Search for a book"
msgstr "Chercher un livre"
@ -1671,9 +1667,9 @@ msgstr "Vous pourrez ajouter des livres lorsque vous commencerez à utiliser %(s
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/groups/members.html:17 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:166
#: bookwyrm/templates/groups/members.html:15
#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1689,7 +1685,7 @@ msgid "Popular on %(site_name)s"
msgstr "Populaire sur %(site_name)s"
#: bookwyrm/templates/get_started/books.html:58
#: bookwyrm/templates/lists/list.html:179
#: bookwyrm/templates/lists/list.html:180
msgid "No books found"
msgstr "Aucun livre trouvé"
@ -1794,7 +1790,7 @@ msgstr "Cette action ne peut pas être annulée"
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
#: bookwyrm/templates/snippets/join_invitation_buttons.html:13
#: bookwyrm/templates/snippets/join_invitation_buttons.html:14
msgid "Delete"
msgstr "Supprimer"
@ -1814,17 +1810,17 @@ msgstr "Description du groupe :"
msgid "Delete group"
msgstr "Supprimer le groupe"
#: bookwyrm/templates/groups/group.html:22
#: bookwyrm/templates/groups/group.html:21
msgid "Members of this group can create group-curated lists."
msgstr "Les membres de ce groupe peuvent créer des listes gérées par le groupe."
#: bookwyrm/templates/groups/group.html:27
#: bookwyrm/templates/groups/group.html:26
#: bookwyrm/templates/lists/create_form.html:5
#: bookwyrm/templates/lists/lists.html:20
msgid "Create List"
msgstr "Créer une liste"
#: bookwyrm/templates/groups/group.html:40
#: bookwyrm/templates/groups/group.html:39
msgid "This group has no lists"
msgstr "Ce groupe n'a pas de liste"
@ -1832,15 +1828,15 @@ msgstr "Ce groupe n'a pas de liste"
msgid "Edit group"
msgstr "Modifier le groupe"
#: bookwyrm/templates/groups/members.html:12
#: bookwyrm/templates/groups/members.html:11
msgid "Search to add a user"
msgstr "Chercher et ajouter un·e utilisateur·rice"
#: bookwyrm/templates/groups/members.html:33
#: bookwyrm/templates/groups/members.html:32
msgid "Leave group"
msgstr "Quitter le groupe"
#: bookwyrm/templates/groups/members.html:55
#: bookwyrm/templates/groups/members.html:54
#: bookwyrm/templates/groups/suggested_users.html:35
#: bookwyrm/templates/snippets/suggested_users.html:31
#: bookwyrm/templates/user/user_preview.html:36
@ -2297,18 +2293,18 @@ msgstr "Supprimer cette liste ?"
msgid "Edit List"
msgstr "Modifier la liste"
#: bookwyrm/templates/lists/embed-list.html:7
#: bookwyrm/templates/lists/embed-list.html:8
#, python-format
msgid "%(list_name)s, a list by %(owner)s"
msgstr "%(list_name)s, une liste de %(owner)s"
#: bookwyrm/templates/lists/embed-list.html:17
#: bookwyrm/templates/lists/embed-list.html:18
#, python-format
msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr "sur <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:42
#: bookwyrm/templates/lists/embed-list.html:27
#: bookwyrm/templates/lists/list.html:43
msgid "This list is currently empty"
msgstr "Cette liste est actuellement vide"
@ -2369,76 +2365,76 @@ msgstr "Créer un Groupe"
msgid "Delete list"
msgstr "Supprimer la liste"
#: bookwyrm/templates/lists/list.html:34
#: bookwyrm/templates/lists/list.html:35
msgid "You successfully suggested a book for this list!"
msgstr "Vous avez suggéré un livre à cette liste!"
#: bookwyrm/templates/lists/list.html:36
#: bookwyrm/templates/lists/list.html:37
msgid "You successfully added a book to this list!"
msgstr "Vous avez ajouté un livre à cette liste!"
#: bookwyrm/templates/lists/list.html:80
#: bookwyrm/templates/lists/list.html:81
#, python-format
msgid "Added by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "Ajouté par <a href=\"%(user_path)s\">%(username)s</a>"
#: bookwyrm/templates/lists/list.html:95
#: bookwyrm/templates/lists/list.html:96
msgid "List position"
msgstr "Position"
#: bookwyrm/templates/lists/list.html:101
#: bookwyrm/templates/lists/list.html:102
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
msgid "Set"
msgstr "Appliquer"
#: bookwyrm/templates/lists/list.html:116
#: bookwyrm/templates/snippets/remove_from_group_button.html:19
#: bookwyrm/templates/lists/list.html:117
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr "Retirer"
#: bookwyrm/templates/lists/list.html:130
#: bookwyrm/templates/lists/list.html:147
#: bookwyrm/templates/lists/list.html:131
#: bookwyrm/templates/lists/list.html:148
msgid "Sort List"
msgstr "Trier la liste"
#: bookwyrm/templates/lists/list.html:140
#: bookwyrm/templates/lists/list.html:141
msgid "Direction"
msgstr "Direction"
#: bookwyrm/templates/lists/list.html:154
#: bookwyrm/templates/lists/list.html:155
msgid "Add Books"
msgstr "Ajouter des livres"
#: bookwyrm/templates/lists/list.html:156
#: bookwyrm/templates/lists/list.html:157
msgid "Suggest Books"
msgstr "Suggérer des livres"
#: bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/lists/list.html:168
msgid "search"
msgstr "chercher"
#: bookwyrm/templates/lists/list.html:173
#: bookwyrm/templates/lists/list.html:174
msgid "Clear search"
msgstr "Vider la requête"
#: bookwyrm/templates/lists/list.html:178
#: bookwyrm/templates/lists/list.html:179
#, python-format
msgid "No books found matching the query \"%(query)s\""
msgstr "Aucun livre trouvé pour la requête « %(query)s»"
#: bookwyrm/templates/lists/list.html:210
#: bookwyrm/templates/lists/list.html:211
msgid "Suggest"
msgstr "Suggérer"
#: bookwyrm/templates/lists/list.html:221
#: bookwyrm/templates/lists/list.html:222
msgid "Embed this list on a website"
msgstr "Intégrez cette liste sur un autre site internet"
#: bookwyrm/templates/lists/list.html:229
#: bookwyrm/templates/lists/list.html:230
msgid "Copy embed code"
msgstr "Copier le code d'intégration"
#: bookwyrm/templates/lists/list.html:231
#: bookwyrm/templates/lists/list.html:232
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr "%(list_name)s, une liste de %(owner)s sur %(site_name)s"
@ -3914,15 +3910,15 @@ msgstr "Terminé"
msgid "This shelf is empty."
msgstr "Cette étagère est vide"
#: bookwyrm/templates/snippets/add_to_group_button.html:15
#: bookwyrm/templates/snippets/add_to_group_button.html:16
msgid "Invite"
msgstr "Inviter"
#: bookwyrm/templates/snippets/add_to_group_button.html:24
#: bookwyrm/templates/snippets/add_to_group_button.html:25
msgid "Uninvite"
msgstr "Annuler l'invitation"
#: bookwyrm/templates/snippets/add_to_group_button.html:28
#: bookwyrm/templates/snippets/add_to_group_button.html:29
#, python-format
msgid "Remove @%(username)s"
msgstr "Retirer @%(username)s"
@ -4010,7 +4006,7 @@ msgstr "Attention spoilers!"
msgid "Include spoiler alert"
msgstr "Afficher une alerte spoiler"
#: bookwyrm/templates/snippets/create_status/layout.html:48
#: bookwyrm/templates/snippets/create_status/layout.html:47
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Commentaire:"
@ -4019,33 +4015,33 @@ msgstr "Commentaire:"
msgid "Post"
msgstr "Publier"
#: bookwyrm/templates/snippets/create_status/quotation.html:17
#: bookwyrm/templates/snippets/create_status/quotation.html:16
msgid "Quote:"
msgstr "Citation:"
#: bookwyrm/templates/snippets/create_status/quotation.html:25
#: bookwyrm/templates/snippets/create_status/quotation.html:24
#, python-format
msgid "An excerpt from '%(book_title)s'"
msgstr "Un extrait de '%(book_title)s'"
#: bookwyrm/templates/snippets/create_status/quotation.html:32
#: bookwyrm/templates/snippets/create_status/quotation.html:31
msgid "Position:"
msgstr "Emplacement :"
#: bookwyrm/templates/snippets/create_status/quotation.html:45
#: bookwyrm/templates/snippets/create_status/quotation.html:44
msgid "On page:"
msgstr "À la page :"
#: bookwyrm/templates/snippets/create_status/quotation.html:51
#: bookwyrm/templates/snippets/create_status/quotation.html:50
msgid "At percent:"
msgstr "Au pourcentage :"
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/snippets/create_status/review.html:24
#, python-format
msgid "Your review of '%(book_title)s'"
msgstr "Votre critique de '%(book_title)s'"
#: bookwyrm/templates/snippets/create_status/review.html:40
#: bookwyrm/templates/snippets/create_status/review.html:39
msgid "Review:"
msgstr "Critique:"
@ -4099,7 +4095,7 @@ msgid "Unfollow"
msgstr "Se désabonner"
#: bookwyrm/templates/snippets/follow_request_buttons.html:7
#: bookwyrm/templates/snippets/join_invitation_buttons.html:8
#: bookwyrm/templates/snippets/join_invitation_buttons.html:9
msgid "Accept"
msgstr "Accepter"
@ -4139,15 +4135,15 @@ msgstr[1] "a noté <em><a href=\"%(path)s\">%(title)s</a></em> : %(display_ratin
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] "Critique de « <a href='%(book_path)s'>%(book_title)s</a> » (%(display_rating)s étoile) : %(review_title)s"
msgstr[1] "Critique de « <a href='%(book_path)s'>%(book_title)s</a> » (%(display_rating)s étoile) : %(review_title)s"
msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:12
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\": %(review_title)s"
msgstr "Critique de « <a href='%(book_path)s'>%(book_title)s</a> » : %(review_title)s"
msgid "Review of \"%(book_title)s\": %(review_title)s"
msgstr ""
#: bookwyrm/templates/snippets/goal_form.html:4
#, python-format
@ -4217,11 +4213,11 @@ msgstr "Abonnemé(e)s uniquement"
msgid "Post privacy"
msgstr "Confidentialité du statut"
#: bookwyrm/templates/snippets/rate_action.html:4
#: bookwyrm/templates/snippets/rate_action.html:5
msgid "Leave a rating"
msgstr "Laisser une note"
#: bookwyrm/templates/snippets/rate_action.html:19
#: bookwyrm/templates/snippets/rate_action.html:20
msgid "Rate"
msgstr "Noter"
@ -4315,29 +4311,29 @@ msgstr "Retirer de %(name)s"
msgid "Finish reading"
msgstr "Terminer la lecture"
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/status/content_status.html:73
msgid "Content warning"
msgstr "Avertissement sur le contenu"
#: bookwyrm/templates/snippets/status/content_status.html:79
#: bookwyrm/templates/snippets/status/content_status.html:80
msgid "Show status"
msgstr "Afficher le statut"
#: bookwyrm/templates/snippets/status/content_status.html:101
#: bookwyrm/templates/snippets/status/content_status.html:102
#, python-format
msgid "(Page %(page)s)"
msgstr "(Page %(page)s)"
#: bookwyrm/templates/snippets/status/content_status.html:103
#: bookwyrm/templates/snippets/status/content_status.html:104
#, python-format
msgid "(%(percent)s%%)"
msgstr "(%(percent)s%%)"
#: bookwyrm/templates/snippets/status/content_status.html:125
#: bookwyrm/templates/snippets/status/content_status.html:126
msgid "Open image in new window"
msgstr "Ouvrir limage dans une nouvelle fenêtre"
#: bookwyrm/templates/snippets/status/content_status.html:144
#: bookwyrm/templates/snippets/status/content_status.html:145
msgid "Hide status"
msgstr "Masquer le statut"

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: 2022-01-17 19:26+0000\n"
"PO-Revision-Date: 2022-01-18 06:22\n"
"POT-Creation-Date: 2022-01-20 17:58+0000\n"
"PO-Revision-Date: 2022-01-21 08:06\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Galician\n"
"Language: gl\n"
@ -56,11 +56,11 @@ msgstr "Título do libro"
#: bookwyrm/forms.py:485 bookwyrm/templates/shelf/shelf.html:155
#: bookwyrm/templates/shelf/shelf.html:187
#: bookwyrm/templates/snippets/create_status/review.html:33
#: bookwyrm/templates/snippets/create_status/review.html:32
msgid "Rating"
msgstr "Puntuación"
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:134
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:135
msgid "Sort By"
msgstr "Ordenar por"
@ -224,69 +224,69 @@ msgstr "Citas"
msgid "Everything else"
msgstr "As outras cousas"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home Timeline"
msgstr "Cronoloxía de Inicio"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home"
msgstr "Inicio"
#: bookwyrm/settings.py:122
#: bookwyrm/settings.py:174
msgid "Books Timeline"
msgstr "Cronoloxía de libros"
#: bookwyrm/settings.py:122 bookwyrm/templates/search/layout.html:21
#: bookwyrm/settings.py:174 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Libros"
#: bookwyrm/settings.py:196
#: bookwyrm/settings.py:248
msgid "English"
msgstr "English (Inglés)"
#: bookwyrm/settings.py:197
#: bookwyrm/settings.py:249
msgid "Deutsch (German)"
msgstr "Alemán (Alemaña)"
#: bookwyrm/settings.py:198
#: bookwyrm/settings.py:250
msgid "Español (Spanish)"
msgstr "Español (España)"
#: bookwyrm/settings.py:199
#: bookwyrm/settings.py:251
msgid "Galego (Galician)"
msgstr "Galego (Galician)"
#: bookwyrm/settings.py:200
#: bookwyrm/settings.py:252
msgid "Italiano (Italian)"
msgstr "Italiano (Italian)"
#: bookwyrm/settings.py:201
#: bookwyrm/settings.py:253
msgid "Français (French)"
msgstr "Francés (Francia)"
#: bookwyrm/settings.py:202
#: bookwyrm/settings.py:254
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lithuanian)"
#: bookwyrm/settings.py:203
#: bookwyrm/settings.py:255
msgid "Norsk (Norwegian)"
msgstr "Noruegués (Norwegian)"
#: bookwyrm/settings.py:204
#: bookwyrm/settings.py:256
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugués brasileiro)"
#: bookwyrm/settings.py:205
#: bookwyrm/settings.py:257
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugués europeo)"
#: bookwyrm/settings.py:206
#: bookwyrm/settings.py:258
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chinés simplificado)"
#: bookwyrm/settings.py:207
#: bookwyrm/settings.py:259
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinés tradicional)"
@ -351,12 +351,8 @@ msgstr "Contacta coa administración"
#: bookwyrm/templates/about/about.html:98
#, python-format
msgid "\n"
" %(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior.\n"
" "
msgstr "\n"
"A moderación e administración de %(site_name)s coidan e xestionan o sitio web, fan cumprir co <a href=\"coc_path\">código de conducta</a> e responden ás denuncias das usuarias sobre spam e mal comportamento.\n"
" "
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior."
msgstr "A moderación e administración de %(site_name)s coidan e xestionan o sitio web, fan cumprir co <a href=\"coc_path\">código de conduta</a> e responden ás denuncias das usuarias sobre spam e mal comportamento."
#: bookwyrm/templates/about/about.html:112
msgid "Moderator"
@ -428,7 +424,7 @@ msgid "Copy address"
msgstr "Copiar enderezo"
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:230
#: bookwyrm/templates/lists/list.html:231
msgid "Copied!"
msgstr "Copiado!"
@ -497,7 +493,7 @@ msgstr "A lectura máis curta deste ano…"
#: bookwyrm/templates/annual_summary/layout.html:245
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "por"
@ -733,9 +729,9 @@ msgstr "Ao cargar os datos vas conectar con <strong>%(source_name)s</strong> e c
#: bookwyrm/templates/author/sync_modal.html:22
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/book/sync_modal.html:22
#: bookwyrm/templates/groups/members.html:30
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
msgid "Confirm"
msgstr "Confirmar"
@ -819,8 +815,8 @@ msgid "Places"
msgstr "Lugares"
#: bookwyrm/templates/book/book.html:348
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:10
#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:11
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -834,7 +830,7 @@ msgstr "Engadir a listaxe"
#: bookwyrm/templates/book/book.html:369
#: bookwyrm/templates/book/cover_add_modal.html:31
#: bookwyrm/templates/lists/list.html:208
#: bookwyrm/templates/lists/list.html:209
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
msgid "Add"
@ -936,7 +932,7 @@ msgid "Back"
msgstr "Atrás"
#: bookwyrm/templates/book/edit/edit_book_form.html:21
#: bookwyrm/templates/snippets/create_status/review.html:16
#: bookwyrm/templates/snippets/create_status/review.html:15
msgid "Title:"
msgstr "Título:"
@ -1653,7 +1649,7 @@ msgid "What are you reading?"
msgstr "Que estás a ler?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:162
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:163
msgid "Search for a book"
msgstr "Buscar un libro"
@ -1671,9 +1667,9 @@ msgstr "Podes engadir libros cando comeces a usar %(site_name)s."
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/groups/members.html:17 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:166
#: bookwyrm/templates/groups/members.html:15
#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1689,7 +1685,7 @@ msgid "Popular on %(site_name)s"
msgstr "Populares en %(site_name)s"
#: bookwyrm/templates/get_started/books.html:58
#: bookwyrm/templates/lists/list.html:179
#: bookwyrm/templates/lists/list.html:180
msgid "No books found"
msgstr "Non se atopan libros"
@ -1794,7 +1790,7 @@ msgstr "Esta acción non ten volta atrás"
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
#: bookwyrm/templates/snippets/join_invitation_buttons.html:13
#: bookwyrm/templates/snippets/join_invitation_buttons.html:14
msgid "Delete"
msgstr "Eliminar"
@ -1814,17 +1810,17 @@ msgstr "Descrición do grupo:"
msgid "Delete group"
msgstr "Eliminar grupo"
#: bookwyrm/templates/groups/group.html:22
#: bookwyrm/templates/groups/group.html:21
msgid "Members of this group can create group-curated lists."
msgstr "Os membros deste grupo poden crear listas xestionadas comunitariamente."
#: bookwyrm/templates/groups/group.html:27
#: bookwyrm/templates/groups/group.html:26
#: bookwyrm/templates/lists/create_form.html:5
#: bookwyrm/templates/lists/lists.html:20
msgid "Create List"
msgstr "Crear lista"
#: bookwyrm/templates/groups/group.html:40
#: bookwyrm/templates/groups/group.html:39
msgid "This group has no lists"
msgstr "Este grupo non ten listaxes"
@ -1832,15 +1828,15 @@ msgstr "Este grupo non ten listaxes"
msgid "Edit group"
msgstr "Editar grupo"
#: bookwyrm/templates/groups/members.html:12
#: bookwyrm/templates/groups/members.html:11
msgid "Search to add a user"
msgstr "Buscar para engadir usuaria"
#: bookwyrm/templates/groups/members.html:33
#: bookwyrm/templates/groups/members.html:32
msgid "Leave group"
msgstr "Saír do grupo"
#: bookwyrm/templates/groups/members.html:55
#: bookwyrm/templates/groups/members.html:54
#: bookwyrm/templates/groups/suggested_users.html:35
#: bookwyrm/templates/snippets/suggested_users.html:31
#: bookwyrm/templates/user/user_preview.html:36
@ -2297,18 +2293,18 @@ msgstr "Eliminar esta lista?"
msgid "Edit List"
msgstr "Editar lista"
#: bookwyrm/templates/lists/embed-list.html:7
#: bookwyrm/templates/lists/embed-list.html:8
#, python-format
msgid "%(list_name)s, a list by %(owner)s"
msgstr "%(list_name)s, unha lista de %(owner)s"
#: bookwyrm/templates/lists/embed-list.html:17
#: bookwyrm/templates/lists/embed-list.html:18
#, python-format
msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr "en <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:42
#: bookwyrm/templates/lists/embed-list.html:27
#: bookwyrm/templates/lists/list.html:43
msgid "This list is currently empty"
msgstr "A lista está baleira neste intre"
@ -2369,76 +2365,76 @@ msgstr "Crea un Grupo"
msgid "Delete list"
msgstr "Eliminar lista"
#: bookwyrm/templates/lists/list.html:34
#: bookwyrm/templates/lists/list.html:35
msgid "You successfully suggested a book for this list!"
msgstr "Suxeriches correctamente un libro para esta lista!"
#: bookwyrm/templates/lists/list.html:36
#: bookwyrm/templates/lists/list.html:37
msgid "You successfully added a book to this list!"
msgstr "Engadiches correctamente un libro a esta lista!"
#: bookwyrm/templates/lists/list.html:80
#: bookwyrm/templates/lists/list.html:81
#, python-format
msgid "Added by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "Engadido por <a href=\"%(user_path)s\">%(username)s</a>"
#: bookwyrm/templates/lists/list.html:95
#: bookwyrm/templates/lists/list.html:96
msgid "List position"
msgstr "Posición da lista"
#: bookwyrm/templates/lists/list.html:101
#: bookwyrm/templates/lists/list.html:102
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
msgid "Set"
msgstr "Establecer"
#: bookwyrm/templates/lists/list.html:116
#: bookwyrm/templates/snippets/remove_from_group_button.html:19
#: bookwyrm/templates/lists/list.html:117
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr "Eliminar"
#: bookwyrm/templates/lists/list.html:130
#: bookwyrm/templates/lists/list.html:147
#: bookwyrm/templates/lists/list.html:131
#: bookwyrm/templates/lists/list.html:148
msgid "Sort List"
msgstr "Ordenar lista"
#: bookwyrm/templates/lists/list.html:140
#: bookwyrm/templates/lists/list.html:141
msgid "Direction"
msgstr "Dirección"
#: bookwyrm/templates/lists/list.html:154
#: bookwyrm/templates/lists/list.html:155
msgid "Add Books"
msgstr "Engadir Libros"
#: bookwyrm/templates/lists/list.html:156
#: bookwyrm/templates/lists/list.html:157
msgid "Suggest Books"
msgstr "Suxerir Libros"
#: bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/lists/list.html:168
msgid "search"
msgstr "buscar"
#: bookwyrm/templates/lists/list.html:173
#: bookwyrm/templates/lists/list.html:174
msgid "Clear search"
msgstr "Limpar busca"
#: bookwyrm/templates/lists/list.html:178
#: bookwyrm/templates/lists/list.html:179
#, python-format
msgid "No books found matching the query \"%(query)s\""
msgstr "Non se atopan libros coa consulta \"%(query)s\""
#: bookwyrm/templates/lists/list.html:210
#: bookwyrm/templates/lists/list.html:211
msgid "Suggest"
msgstr "Suxire"
#: bookwyrm/templates/lists/list.html:221
#: bookwyrm/templates/lists/list.html:222
msgid "Embed this list on a website"
msgstr "Utiliza esta lista nunha páxina web"
#: bookwyrm/templates/lists/list.html:229
#: bookwyrm/templates/lists/list.html:230
msgid "Copy embed code"
msgstr "Copia o código a incluír"
#: bookwyrm/templates/lists/list.html:231
#: bookwyrm/templates/lists/list.html:232
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr "%(list_name)s, unha lista de %(owner)s en %(site_name)s"
@ -3914,15 +3910,15 @@ msgstr "Rematado"
msgid "This shelf is empty."
msgstr "Este estante esta baleiro."
#: bookwyrm/templates/snippets/add_to_group_button.html:15
#: bookwyrm/templates/snippets/add_to_group_button.html:16
msgid "Invite"
msgstr "Convidar"
#: bookwyrm/templates/snippets/add_to_group_button.html:24
#: bookwyrm/templates/snippets/add_to_group_button.html:25
msgid "Uninvite"
msgstr "Retirar convite"
#: bookwyrm/templates/snippets/add_to_group_button.html:28
#: bookwyrm/templates/snippets/add_to_group_button.html:29
#, python-format
msgid "Remove @%(username)s"
msgstr "Eliminar @%(username)s"
@ -4010,7 +4006,7 @@ msgstr "Contén Spoilers!"
msgid "Include spoiler alert"
msgstr "Incluír alerta de spoiler"
#: bookwyrm/templates/snippets/create_status/layout.html:48
#: bookwyrm/templates/snippets/create_status/layout.html:47
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Comentario:"
@ -4019,33 +4015,33 @@ msgstr "Comentario:"
msgid "Post"
msgstr "Publicación"
#: bookwyrm/templates/snippets/create_status/quotation.html:17
#: bookwyrm/templates/snippets/create_status/quotation.html:16
msgid "Quote:"
msgstr "Cita:"
#: bookwyrm/templates/snippets/create_status/quotation.html:25
#: bookwyrm/templates/snippets/create_status/quotation.html:24
#, python-format
msgid "An excerpt from '%(book_title)s'"
msgstr "Un extracto de '%(book_title)s'"
#: bookwyrm/templates/snippets/create_status/quotation.html:32
#: bookwyrm/templates/snippets/create_status/quotation.html:31
msgid "Position:"
msgstr "Posición:"
#: bookwyrm/templates/snippets/create_status/quotation.html:45
#: bookwyrm/templates/snippets/create_status/quotation.html:44
msgid "On page:"
msgstr "Na páxina:"
#: bookwyrm/templates/snippets/create_status/quotation.html:51
#: bookwyrm/templates/snippets/create_status/quotation.html:50
msgid "At percent:"
msgstr "Na porcentaxe:"
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/snippets/create_status/review.html:24
#, python-format
msgid "Your review of '%(book_title)s'"
msgstr "A túa recensión de '%(book_title)s'"
#: bookwyrm/templates/snippets/create_status/review.html:40
#: bookwyrm/templates/snippets/create_status/review.html:39
msgid "Review:"
msgstr "Recensión:"
@ -4099,7 +4095,7 @@ msgid "Unfollow"
msgstr "Non seguir"
#: bookwyrm/templates/snippets/follow_request_buttons.html:7
#: bookwyrm/templates/snippets/join_invitation_buttons.html:8
#: bookwyrm/templates/snippets/join_invitation_buttons.html:9
msgid "Accept"
msgstr "Aceptar"
@ -4139,15 +4135,15 @@ msgstr[1] "valorado <em><a href=\"%(path)s\">%(title)s</a></em>: %(display_ratin
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] "Recensión de \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s estrela): %(review_title)s"
msgstr[1] "Recensión de \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s estrelas): %(review_title)s"
msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] "Recensión de \"%(book_title)s\" (%(display_rating)s estrela): %(review_title)s"
msgstr[1] "Recensión de \"%(book_title)s\" (%(display_rating)s estrelas): %(review_title)s"
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:12
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\": %(review_title)s"
msgstr "Recensión de \"<a href='%(book_path)s'>%(book_title)s</a>\" %(review_title)s"
msgid "Review of \"%(book_title)s\": %(review_title)s"
msgstr "Recensión de \"%(book_title)s\": %(review_title)s"
#: bookwyrm/templates/snippets/goal_form.html:4
#, python-format
@ -4217,11 +4213,11 @@ msgstr "Só seguidoras"
msgid "Post privacy"
msgstr "Privacidade da publicación"
#: bookwyrm/templates/snippets/rate_action.html:4
#: bookwyrm/templates/snippets/rate_action.html:5
msgid "Leave a rating"
msgstr "Fai unha valoración"
#: bookwyrm/templates/snippets/rate_action.html:19
#: bookwyrm/templates/snippets/rate_action.html:20
msgid "Rate"
msgstr "Valorar"
@ -4315,29 +4311,29 @@ msgstr "Eliminar de %(name)s"
msgid "Finish reading"
msgstr "Rematar a lectura"
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/status/content_status.html:73
msgid "Content warning"
msgstr "Aviso sobre o contido"
#: bookwyrm/templates/snippets/status/content_status.html:79
#: bookwyrm/templates/snippets/status/content_status.html:80
msgid "Show status"
msgstr "Mostrar estado"
#: bookwyrm/templates/snippets/status/content_status.html:101
#: bookwyrm/templates/snippets/status/content_status.html:102
#, python-format
msgid "(Page %(page)s)"
msgstr "(Páxina %(page)s)"
#: bookwyrm/templates/snippets/status/content_status.html:103
#: bookwyrm/templates/snippets/status/content_status.html:104
#, python-format
msgid "(%(percent)s%%)"
msgstr "(%(percent)s%%)"
#: bookwyrm/templates/snippets/status/content_status.html:125
#: bookwyrm/templates/snippets/status/content_status.html:126
msgid "Open image in new window"
msgstr "Abrir imaxe en nova ventá"
#: bookwyrm/templates/snippets/status/content_status.html:144
#: bookwyrm/templates/snippets/status/content_status.html:145
msgid "Hide status"
msgstr "Agochar estado"

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: 2022-01-17 19:26+0000\n"
"PO-Revision-Date: 2022-01-19 23:20\n"
"POT-Creation-Date: 2022-01-20 17:58+0000\n"
"PO-Revision-Date: 2022-01-22 12:25\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Italian\n"
"Language: it\n"
@ -56,11 +56,11 @@ msgstr "Titolo del libro"
#: bookwyrm/forms.py:485 bookwyrm/templates/shelf/shelf.html:155
#: bookwyrm/templates/shelf/shelf.html:187
#: bookwyrm/templates/snippets/create_status/review.html:33
#: bookwyrm/templates/snippets/create_status/review.html:32
msgid "Rating"
msgstr "Valutazione"
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:134
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:135
msgid "Sort By"
msgstr "Ordina per"
@ -224,69 +224,69 @@ msgstr "Citazioni"
msgid "Everything else"
msgstr "Tutto il resto"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home Timeline"
msgstr "La tua timeline"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home"
msgstr "Home"
#: bookwyrm/settings.py:122
#: bookwyrm/settings.py:174
msgid "Books Timeline"
msgstr "Timeline dei libri"
#: bookwyrm/settings.py:122 bookwyrm/templates/search/layout.html:21
#: bookwyrm/settings.py:174 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Libri"
#: bookwyrm/settings.py:196
#: bookwyrm/settings.py:248
msgid "English"
msgstr "English (Inglese)"
#: bookwyrm/settings.py:197
#: bookwyrm/settings.py:249
msgid "Deutsch (German)"
msgstr "Deutsch (Tedesco)"
#: bookwyrm/settings.py:198
#: bookwyrm/settings.py:250
msgid "Español (Spanish)"
msgstr "Español (Spagnolo)"
#: bookwyrm/settings.py:199
#: bookwyrm/settings.py:251
msgid "Galego (Galician)"
msgstr "Galego (Galiziano)"
#: bookwyrm/settings.py:200
#: bookwyrm/settings.py:252
msgid "Italiano (Italian)"
msgstr "Italiano (Italiano)"
#: bookwyrm/settings.py:201
#: bookwyrm/settings.py:253
msgid "Français (French)"
msgstr "Français (Francese)"
#: bookwyrm/settings.py:202
#: bookwyrm/settings.py:254
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituano)"
#: bookwyrm/settings.py:203
#: bookwyrm/settings.py:255
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norvegese)"
#: bookwyrm/settings.py:204
#: bookwyrm/settings.py:256
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portoghese Brasiliano)"
#: bookwyrm/settings.py:205
#: bookwyrm/settings.py:257
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portoghese europeo)"
#: bookwyrm/settings.py:206
#: bookwyrm/settings.py:258
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Cinese Semplificato)"
#: bookwyrm/settings.py:207
#: bookwyrm/settings.py:259
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Cinese Tradizionale)"
@ -351,12 +351,8 @@ msgstr "Incontra gli amministratori"
#: bookwyrm/templates/about/about.html:98
#, python-format
msgid "\n"
" %(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior.\n"
" "
msgstr "\n"
"I moderatori e gli amministratori di %(site_name)s mantengono il sito attivo e funzionante, applicano il <a href=\"coc_path\">codice di condotta</a>, e rispondono quando gli utenti segnalano spam o comportamenti non adeguati.\n"
" "
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior."
msgstr "I moderatori e gli amministratori di %(site_name)s mantengono il sito attivo e funzionante, applicano il <a href=\"coc_path\">codice di condotta</a>, e rispondono quando gli utenti segnalano spam o comportamenti non adeguati."
#: bookwyrm/templates/about/about.html:112
msgid "Moderator"
@ -428,7 +424,7 @@ msgid "Copy address"
msgstr "Copia l'indirizzo"
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:230
#: bookwyrm/templates/lists/list.html:231
msgid "Copied!"
msgstr "Copiato!"
@ -497,7 +493,7 @@ msgstr "La loro lettura più breve questanno…"
#: bookwyrm/templates/annual_summary/layout.html:245
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "di"
@ -733,9 +729,9 @@ msgstr "Il caricamento dei dati si collegherà a <strong>%(source_name)s</strong
#: bookwyrm/templates/author/sync_modal.html:22
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/book/sync_modal.html:22
#: bookwyrm/templates/groups/members.html:30
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
msgid "Confirm"
msgstr "Conferma"
@ -819,14 +815,14 @@ msgid "Places"
msgstr "Luoghi"
#: bookwyrm/templates/book/book.html:348
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:10
#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:11
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
#: bookwyrm/templates/user/layout.html:85
msgid "Lists"
msgstr "Elenchi"
msgstr "Liste"
#: bookwyrm/templates/book/book.html:359
msgid "Add to list"
@ -834,7 +830,7 @@ msgstr "Aggiungi all'elenco"
#: bookwyrm/templates/book/book.html:369
#: bookwyrm/templates/book/cover_add_modal.html:31
#: bookwyrm/templates/lists/list.html:208
#: bookwyrm/templates/lists/list.html:209
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
msgid "Add"
@ -936,7 +932,7 @@ msgid "Back"
msgstr "Indietro"
#: bookwyrm/templates/book/edit/edit_book_form.html:21
#: bookwyrm/templates/snippets/create_status/review.html:16
#: bookwyrm/templates/snippets/create_status/review.html:15
msgid "Title:"
msgstr "Titolo:"
@ -1653,7 +1649,7 @@ msgid "What are you reading?"
msgstr "Cosa stai leggendo?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:162
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:163
msgid "Search for a book"
msgstr "Cerca un libro"
@ -1671,9 +1667,9 @@ msgstr "Puoi aggiungere libri quando inizi a usare %(site_name)s."
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/groups/members.html:17 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:166
#: bookwyrm/templates/groups/members.html:15
#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1689,7 +1685,7 @@ msgid "Popular on %(site_name)s"
msgstr "Popolare su %(site_name)s"
#: bookwyrm/templates/get_started/books.html:58
#: bookwyrm/templates/lists/list.html:179
#: bookwyrm/templates/lists/list.html:180
msgid "No books found"
msgstr "Nessun libro trovato"
@ -1794,7 +1790,7 @@ msgstr "Questa azione non può essere annullata"
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
#: bookwyrm/templates/snippets/join_invitation_buttons.html:13
#: bookwyrm/templates/snippets/join_invitation_buttons.html:14
msgid "Delete"
msgstr "Elimina"
@ -1814,17 +1810,17 @@ msgstr "Descrizione gruppo:"
msgid "Delete group"
msgstr "Elimina gruppo"
#: bookwyrm/templates/groups/group.html:22
#: bookwyrm/templates/groups/group.html:21
msgid "Members of this group can create group-curated lists."
msgstr "I membri di questo gruppo possono creare liste curate dal gruppo."
#: bookwyrm/templates/groups/group.html:27
#: bookwyrm/templates/groups/group.html:26
#: bookwyrm/templates/lists/create_form.html:5
#: bookwyrm/templates/lists/lists.html:20
msgid "Create List"
msgstr "Crea Lista"
#: bookwyrm/templates/groups/group.html:40
#: bookwyrm/templates/groups/group.html:39
msgid "This group has no lists"
msgstr "Questo gruppo non ha alcuna lista"
@ -1832,15 +1828,15 @@ msgstr "Questo gruppo non ha alcuna lista"
msgid "Edit group"
msgstr "Modifica gruppo"
#: bookwyrm/templates/groups/members.html:12
#: bookwyrm/templates/groups/members.html:11
msgid "Search to add a user"
msgstr "Cerca o aggiungi utente"
#: bookwyrm/templates/groups/members.html:33
#: bookwyrm/templates/groups/members.html:32
msgid "Leave group"
msgstr "Lascia il gruppo"
#: bookwyrm/templates/groups/members.html:55
#: bookwyrm/templates/groups/members.html:54
#: bookwyrm/templates/groups/suggested_users.html:35
#: bookwyrm/templates/snippets/suggested_users.html:31
#: bookwyrm/templates/user/user_preview.html:36
@ -2297,18 +2293,18 @@ msgstr "Vuoi eliminare la lista selezionata?"
msgid "Edit List"
msgstr "Modifica lista"
#: bookwyrm/templates/lists/embed-list.html:7
#: bookwyrm/templates/lists/embed-list.html:8
#, python-format
msgid "%(list_name)s, a list by %(owner)s"
msgstr "%(list_name)s, una lista di %(owner)s"
#: bookwyrm/templates/lists/embed-list.html:17
#: bookwyrm/templates/lists/embed-list.html:18
#, python-format
msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr "su <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:42
#: bookwyrm/templates/lists/embed-list.html:27
#: bookwyrm/templates/lists/list.html:43
msgid "This list is currently empty"
msgstr "Questa lista è attualmente vuota"
@ -2369,76 +2365,76 @@ msgstr "Crea un gruppo"
msgid "Delete list"
msgstr "Elimina lista"
#: bookwyrm/templates/lists/list.html:34
#: bookwyrm/templates/lists/list.html:35
msgid "You successfully suggested a book for this list!"
msgstr "Hai consigliato con successo un libro per questa lista!"
#: bookwyrm/templates/lists/list.html:36
#: bookwyrm/templates/lists/list.html:37
msgid "You successfully added a book to this list!"
msgstr "Hai consigliato con successo un libro per questa lista!"
#: bookwyrm/templates/lists/list.html:80
#: bookwyrm/templates/lists/list.html:81
#, python-format
msgid "Added by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "Aggiunto da <a href=\"%(user_path)s\">%(username)s</a>"
#: bookwyrm/templates/lists/list.html:95
#: bookwyrm/templates/lists/list.html:96
msgid "List position"
msgstr "Posizione elenco"
#: bookwyrm/templates/lists/list.html:101
#: bookwyrm/templates/lists/list.html:102
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
msgid "Set"
msgstr "Imposta"
#: bookwyrm/templates/lists/list.html:116
#: bookwyrm/templates/snippets/remove_from_group_button.html:19
#: bookwyrm/templates/lists/list.html:117
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr "Elimina"
#: bookwyrm/templates/lists/list.html:130
#: bookwyrm/templates/lists/list.html:147
#: bookwyrm/templates/lists/list.html:131
#: bookwyrm/templates/lists/list.html:148
msgid "Sort List"
msgstr "Ordine lista"
#: bookwyrm/templates/lists/list.html:140
#: bookwyrm/templates/lists/list.html:141
msgid "Direction"
msgstr "Direzione"
#: bookwyrm/templates/lists/list.html:154
#: bookwyrm/templates/lists/list.html:155
msgid "Add Books"
msgstr "Aggiungi Libri"
#: bookwyrm/templates/lists/list.html:156
#: bookwyrm/templates/lists/list.html:157
msgid "Suggest Books"
msgstr "Libri consigliati"
#: bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/lists/list.html:168
msgid "search"
msgstr "cerca"
#: bookwyrm/templates/lists/list.html:173
#: bookwyrm/templates/lists/list.html:174
msgid "Clear search"
msgstr "Cancella ricerca"
#: bookwyrm/templates/lists/list.html:178
#: bookwyrm/templates/lists/list.html:179
#, python-format
msgid "No books found matching the query \"%(query)s\""
msgstr "Nessun libro trovato corrispondente alla query \"%(query)s\""
#: bookwyrm/templates/lists/list.html:210
#: bookwyrm/templates/lists/list.html:211
msgid "Suggest"
msgstr "Suggerisci"
#: bookwyrm/templates/lists/list.html:221
#: bookwyrm/templates/lists/list.html:222
msgid "Embed this list on a website"
msgstr "Incorpora questa lista in un sito web"
#: bookwyrm/templates/lists/list.html:229
#: bookwyrm/templates/lists/list.html:230
msgid "Copy embed code"
msgstr "Copia codice di incorporamento"
#: bookwyrm/templates/lists/list.html:231
#: bookwyrm/templates/lists/list.html:232
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr "%(list_name)s, una lista di %(owner)s su %(site_name)s"
@ -3914,15 +3910,15 @@ msgstr "Completato"
msgid "This shelf is empty."
msgstr "Questo scaffale è vuoto."
#: bookwyrm/templates/snippets/add_to_group_button.html:15
#: bookwyrm/templates/snippets/add_to_group_button.html:16
msgid "Invite"
msgstr "Invita"
#: bookwyrm/templates/snippets/add_to_group_button.html:24
#: bookwyrm/templates/snippets/add_to_group_button.html:25
msgid "Uninvite"
msgstr "Revoca invito"
#: bookwyrm/templates/snippets/add_to_group_button.html:28
#: bookwyrm/templates/snippets/add_to_group_button.html:29
#, python-format
msgid "Remove @%(username)s"
msgstr "Rimuovi %(username)s"
@ -4010,7 +4006,7 @@ msgstr "Attenzione Spoiler!"
msgid "Include spoiler alert"
msgstr "Includi avviso spoiler"
#: bookwyrm/templates/snippets/create_status/layout.html:48
#: bookwyrm/templates/snippets/create_status/layout.html:47
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Commenta:"
@ -4019,33 +4015,33 @@ msgstr "Commenta:"
msgid "Post"
msgstr "Pubblica"
#: bookwyrm/templates/snippets/create_status/quotation.html:17
#: bookwyrm/templates/snippets/create_status/quotation.html:16
msgid "Quote:"
msgstr "Citazione:"
#: bookwyrm/templates/snippets/create_status/quotation.html:25
#: bookwyrm/templates/snippets/create_status/quotation.html:24
#, python-format
msgid "An excerpt from '%(book_title)s'"
msgstr "Un estratto da '%(book_title)s'"
#: bookwyrm/templates/snippets/create_status/quotation.html:32
#: bookwyrm/templates/snippets/create_status/quotation.html:31
msgid "Position:"
msgstr "Posizione:"
#: bookwyrm/templates/snippets/create_status/quotation.html:45
#: bookwyrm/templates/snippets/create_status/quotation.html:44
msgid "On page:"
msgstr "Alla pagina:"
#: bookwyrm/templates/snippets/create_status/quotation.html:51
#: bookwyrm/templates/snippets/create_status/quotation.html:50
msgid "At percent:"
msgstr "Alla percentuale:"
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/snippets/create_status/review.html:24
#, python-format
msgid "Your review of '%(book_title)s'"
msgstr "La tua recensione di '%(book_title)s'"
#: bookwyrm/templates/snippets/create_status/review.html:40
#: bookwyrm/templates/snippets/create_status/review.html:39
msgid "Review:"
msgstr "Recensione:"
@ -4099,7 +4095,7 @@ msgid "Unfollow"
msgstr "Smetti di seguire"
#: bookwyrm/templates/snippets/follow_request_buttons.html:7
#: bookwyrm/templates/snippets/join_invitation_buttons.html:8
#: bookwyrm/templates/snippets/join_invitation_buttons.html:9
msgid "Accept"
msgstr "Accetta"
@ -4139,15 +4135,15 @@ msgstr[1] "valutato <em><a href=\"%(path)s\">%(title)s</a></em>: %(display_ratin
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] "Recensione di \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s stella): %(review_title)s"
msgstr[1] "Recensione di \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s stelle): %(review_title)s"
msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] "Recensione di \"%(book_title)s\" (%(display_rating)s stella): %(review_title)s"
msgstr[1] "Recensione di \"%(book_title)s\" (%(display_rating)s stelle): %(review_title)s"
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:12
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\": %(review_title)s"
msgstr "Recensione di \"<a href='%(book_path)s'>%(book_title)s</a>\": %(review_title)s"
msgid "Review of \"%(book_title)s\": %(review_title)s"
msgstr "Recensione di \"%(book_title)s\": %(review_title)s"
#: bookwyrm/templates/snippets/goal_form.html:4
#, python-format
@ -4217,11 +4213,11 @@ msgstr "Solo Followers"
msgid "Post privacy"
msgstr "Privacy dei post"
#: bookwyrm/templates/snippets/rate_action.html:4
#: bookwyrm/templates/snippets/rate_action.html:5
msgid "Leave a rating"
msgstr "Lascia una recensione"
#: bookwyrm/templates/snippets/rate_action.html:19
#: bookwyrm/templates/snippets/rate_action.html:20
msgid "Rate"
msgstr "Vota"
@ -4315,29 +4311,29 @@ msgstr "Rimuovi da %(name)s"
msgid "Finish reading"
msgstr "Finito di leggere"
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/status/content_status.html:73
msgid "Content warning"
msgstr "Avviso sul contenuto"
#: bookwyrm/templates/snippets/status/content_status.html:79
#: bookwyrm/templates/snippets/status/content_status.html:80
msgid "Show status"
msgstr "Mostra stato"
#: bookwyrm/templates/snippets/status/content_status.html:101
#: bookwyrm/templates/snippets/status/content_status.html:102
#, python-format
msgid "(Page %(page)s)"
msgstr "(Pagina %(page)s)"
#: bookwyrm/templates/snippets/status/content_status.html:103
#: bookwyrm/templates/snippets/status/content_status.html:104
#, python-format
msgid "(%(percent)s%%)"
msgstr "(%(percent)s%%)"
#: bookwyrm/templates/snippets/status/content_status.html:125
#: bookwyrm/templates/snippets/status/content_status.html:126
msgid "Open image in new window"
msgstr "Apri immagine in una nuova finestra"
#: bookwyrm/templates/snippets/status/content_status.html:144
#: bookwyrm/templates/snippets/status/content_status.html:145
msgid "Hide status"
msgstr "Nascondi lo stato"
@ -4379,7 +4375,7 @@ msgstr "valutato <a href=\"%(book_path)s\">%(book)s</a>:"
#: bookwyrm/templates/snippets/status/headers/read.html:10
#, python-format
msgid "finished reading <a href=\"%(book_path)s\">%(book)s</a> by <a href=\"%(author_path)s\">%(author_name)s</a>"
msgstr "lettura del libro <a href=\"%(book_path)s\">%(book)s</a> di <a href=\"%(author_path)s\">%(author_name)s</a> completata"
msgstr "ha finito di leggere <a href=\"%(book_path)s\">%(book)s</a> di <a href=\"%(author_path)s\">%(author_name)s</a>"
#: bookwyrm/templates/snippets/status/headers/read.html:17
#, python-format
@ -4389,7 +4385,7 @@ msgstr "lettura di <a href=\"%(book_path)s\">%(book)s</a> completata"
#: bookwyrm/templates/snippets/status/headers/reading.html:10
#, python-format
msgid "started reading <a href=\"%(book_path)s\">%(book)s</a> by <a href=\"%(author_path)s\">%(author_name)s</a>"
msgstr "lettura del libro <a href=\"%(book_path)s\">%(book)s</a> di <a href=\"%(author_path)s\">%(author_name)s</a> iniziata"
msgstr "ha iniziato a leggere <a href=\"%(book_path)s\">%(book)s</a> di <a href=\"%(author_path)s\">%(author_name)s</a>"
#: bookwyrm/templates/snippets/status/headers/reading.html:17
#, python-format
@ -4409,7 +4405,7 @@ msgstr "recensito <a href=\"%(book_path)s\">%(book)s</a>"
#: bookwyrm/templates/snippets/status/headers/to_read.html:10
#, python-format
msgid "wants to read <a href=\"%(book_path)s\">%(book)s</a> by <a href=\"%(author_path)s\">%(author_name)s</a>"
msgstr "da leggere <a href=\"%(book_path)s\">%(book)s</a> da <a href=\"%(author_path)s\">%(author_name)s</a>"
msgstr "vuole leggere <a href=\"%(book_path)s\">%(book)s</a> di <a href=\"%(author_path)s\">%(author_name)s</a>"
#: bookwyrm/templates/snippets/status/headers/to_read.html:17
#, python-format
@ -4562,7 +4558,7 @@ msgstr "Visualizza tutti i libri"
#: bookwyrm/templates/user/user.html:58
#, python-format
msgid "%(current_year)s Reading Goal"
msgstr "Obiettivo di lettura del %(current_year)s"
msgstr "Obiettivo di lettura %(current_year)s"
#: bookwyrm/templates/user/user.html:65
msgid "User Activity"

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: 2022-01-17 19:26+0000\n"
"PO-Revision-Date: 2022-01-17 19:57\n"
"POT-Creation-Date: 2022-01-20 17:58+0000\n"
"PO-Revision-Date: 2022-01-21 22:21\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Lithuanian\n"
"Language: lt\n"
@ -56,11 +56,11 @@ msgstr "Knygos antraštė"
#: bookwyrm/forms.py:485 bookwyrm/templates/shelf/shelf.html:155
#: bookwyrm/templates/shelf/shelf.html:187
#: bookwyrm/templates/snippets/create_status/review.html:33
#: bookwyrm/templates/snippets/create_status/review.html:32
msgid "Rating"
msgstr "Įvertinimas"
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:134
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:135
msgid "Sort By"
msgstr "Rūšiuoti pagal"
@ -74,7 +74,7 @@ msgstr "Mažėjančia tvarka"
#: bookwyrm/forms.py:505
msgid "Reading finish date cannot be before start date."
msgstr ""
msgstr "Skaitymo pabaigos data negali būti prieš skaitymo pradžios datą."
#: bookwyrm/importers/importer.py:145 bookwyrm/importers/importer.py:167
msgid "Error loading book"
@ -193,20 +193,20 @@ msgstr "Privatu"
#: bookwyrm/models/link.py:51
msgid "Free"
msgstr ""
msgstr "Nemokama"
#: bookwyrm/models/link.py:52
msgid "Purchasable"
msgstr ""
msgstr "Galima nusipirkti"
#: bookwyrm/models/link.py:53
msgid "Available for loan"
msgstr ""
msgstr "Galima pasiskolinti"
#: bookwyrm/models/link.py:70
#: bookwyrm/templates/settings/link_domains/link_domains.html:23
msgid "Approved"
msgstr ""
msgstr "Patvirtinti"
#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:272
msgid "Reviews"
@ -224,69 +224,69 @@ msgstr "Citatos"
msgid "Everything else"
msgstr "Visa kita"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home Timeline"
msgstr "Pagrindinė siena"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home"
msgstr "Pagrindinis"
#: bookwyrm/settings.py:122
#: bookwyrm/settings.py:174
msgid "Books Timeline"
msgstr "Knygų siena"
#: bookwyrm/settings.py:122 bookwyrm/templates/search/layout.html:21
#: bookwyrm/settings.py:174 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Knygos"
#: bookwyrm/settings.py:196
#: bookwyrm/settings.py:248
msgid "English"
msgstr "English (Anglų)"
#: bookwyrm/settings.py:197
#: bookwyrm/settings.py:249
msgid "Deutsch (German)"
msgstr "Deutsch (Vokiečių)"
#: bookwyrm/settings.py:198
#: bookwyrm/settings.py:250
msgid "Español (Spanish)"
msgstr "Español (Ispanų)"
#: bookwyrm/settings.py:199
#: bookwyrm/settings.py:251
msgid "Galego (Galician)"
msgstr "Galego (galisų)"
#: bookwyrm/settings.py:200
#: bookwyrm/settings.py:252
msgid "Italiano (Italian)"
msgstr ""
msgstr "Italų (Italian)"
#: bookwyrm/settings.py:201
#: bookwyrm/settings.py:253
msgid "Français (French)"
msgstr "Français (Prancūzų)"
#: bookwyrm/settings.py:202
#: bookwyrm/settings.py:254
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių"
#: bookwyrm/settings.py:203
#: bookwyrm/settings.py:255
msgid "Norsk (Norwegian)"
msgstr ""
msgstr "Norvegų (Norwegian)"
#: bookwyrm/settings.py:204
#: bookwyrm/settings.py:256
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português brasileiro (Brazilijos portugalų)"
#: bookwyrm/settings.py:205
#: bookwyrm/settings.py:257
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Europos portugalų)"
#: bookwyrm/settings.py:206
#: bookwyrm/settings.py:258
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Supaprastinta kinų)"
#: bookwyrm/settings.py:207
#: bookwyrm/settings.py:259
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Tradicinė kinų)"
@ -313,7 +313,7 @@ msgstr "Kažkas nepavyko. Atsiprašome."
#: bookwyrm/templates/about/about.html:9
#: bookwyrm/templates/about/layout.html:35
msgid "About"
msgstr ""
msgstr "Apie"
#: bookwyrm/templates/about/about.html:18
#: bookwyrm/templates/get_started/layout.html:20
@ -324,22 +324,22 @@ msgstr "Sveiki atvykę į %(site_name)s!"
#: bookwyrm/templates/about/about.html:22
#, python-format
msgid "%(site_name)s is part of <em>BookWyrm</em>, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the <a href=\"https://joinbookwyrm.com/instances/\" target=\"_blank\">BookWyrm network</a>, this community is unique."
msgstr ""
msgstr "%(site_name)s yra <em>BookWyrm</em>dalis, tinklo nepriklausomų skaitytojų bendruomenių. Jūs galite bendrauti su nariais iš šio <a href=\"https://joinbookwyrm.com/instances/\" target=\"_blank\">BookWyrm tinklo</a>, tačiau ši bendruomenė yra unikali."
#: bookwyrm/templates/about/about.html:39
#, python-format
msgid "<a href=\"%(book_path)s\"><em>%(title)s</em></a> is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5."
msgstr ""
msgstr "<a href=\"%(book_path)s\"><em>%(title)s</em></a> yra %(site_name)s's mėgstamiausia knyga, kurios vidutinis įvertinimas yra %(rating)s iš 5."
#: bookwyrm/templates/about/about.html:58
#, python-format
msgid "More %(site_name)s users want to read <a href=\"%(book_path)s\"><em>%(title)s</em></a> than any other book."
msgstr ""
msgstr "Daugiau %(site_name)s narių nori perskaityti <a href=\"%(book_path)s\"><em>%(title)s</em></a> negu bet kurią kitą knygą."
#: bookwyrm/templates/about/about.html:77
#, python-format
msgid "<a href=\"%(book_path)s\"><em>%(title)s</em></a> has the most divisive ratings of any book on %(site_name)s."
msgstr ""
msgstr "<a href=\"%(book_path)s\"><em>%(title)s</em></a> labiausiai kontroversiškai reitinguota %(site_name)s."
#: bookwyrm/templates/about/about.html:88
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, <a href='https://joinbookwyrm.com/get-involved' target='_blank'>reach out</a> and make yourself heard."
@ -347,18 +347,16 @@ msgstr ""
#: bookwyrm/templates/about/about.html:95
msgid "Meet your admins"
msgstr ""
msgstr "Šio serverio administratoriai"
#: bookwyrm/templates/about/about.html:98
#, python-format
msgid "\n"
" %(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior.\n"
" "
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior."
msgstr ""
#: bookwyrm/templates/about/about.html:112
msgid "Moderator"
msgstr ""
msgstr "Moderatorius"
#: bookwyrm/templates/about/about.html:114 bookwyrm/templates/layout.html:131
msgid "Admin"
@ -379,15 +377,15 @@ msgstr "Elgesio kodeksas"
#: bookwyrm/templates/about/layout.html:11
msgid "Active users:"
msgstr ""
msgstr "Aktyvūs vartotojai:"
#: bookwyrm/templates/about/layout.html:15
msgid "Statuses posted:"
msgstr ""
msgstr "Publikuotos būsenos:"
#: bookwyrm/templates/about/layout.html:19
msgid "Software version:"
msgstr ""
msgstr "Serverio programinės įrangos versija:"
#: bookwyrm/templates/about/layout.html:30
#: bookwyrm/templates/embed-layout.html:34 bookwyrm/templates/layout.html:229
@ -426,7 +424,7 @@ msgid "Copy address"
msgstr "Kopijuoti adresą"
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:230
#: bookwyrm/templates/lists/list.html:231
msgid "Copied!"
msgstr "Nukopijuota"
@ -461,7 +459,7 @@ msgstr "Jei padarysite puslapį privačiu - senas raktas nustos galioti. Ateityj
#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didnt finish any books in %(year)s"
msgstr ""
msgstr "Gaila, bet %(display_name)s %(year)s metais neperskaitė nei vienos knygos"
#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
@ -499,7 +497,7 @@ msgstr "Trumpiausias skaitinys tais metais…"
#: bookwyrm/templates/annual_summary/layout.html:245
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr " "
@ -739,9 +737,9 @@ msgstr "Duomenų įkėlimas prisijungs prie <strong>%(source_name)s</strong> ir
#: bookwyrm/templates/author/sync_modal.html:22
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/book/sync_modal.html:22
#: bookwyrm/templates/groups/members.html:30
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
msgid "Confirm"
msgstr "Patvirtinti"
@ -827,8 +825,8 @@ msgid "Places"
msgstr "Vietos"
#: bookwyrm/templates/book/book.html:348
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:10
#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:11
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -842,7 +840,7 @@ msgstr "Pridėti prie sąrašo"
#: bookwyrm/templates/book/book.html:369
#: bookwyrm/templates/book/cover_add_modal.html:31
#: bookwyrm/templates/lists/list.html:208
#: bookwyrm/templates/lists/list.html:209
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
msgid "Add"
@ -944,7 +942,7 @@ msgid "Back"
msgstr "Atgal"
#: bookwyrm/templates/book/edit/edit_book_form.html:21
#: bookwyrm/templates/snippets/create_status/review.html:16
#: bookwyrm/templates/snippets/create_status/review.html:15
msgid "Title:"
msgstr "Pavadinimas:"
@ -1076,51 +1074,52 @@ msgstr "Paieškos leidimai"
#: bookwyrm/templates/book/file_links/add_link_modal.html:6
msgid "Add file link"
msgstr ""
msgstr "Pridėti nuorodą į failą"
#: bookwyrm/templates/book/file_links/add_link_modal.html:19
msgid "Links from unknown domains will need to be approved by a moderator before they are added."
msgstr ""
msgstr "Nuorodos iš nežinomų domenų turi būti patvirtintos moderatorių."
#: bookwyrm/templates/book/file_links/add_link_modal.html:24
msgid "URL:"
msgstr ""
msgstr "Nuoroda:"
#: bookwyrm/templates/book/file_links/add_link_modal.html:29
msgid "File type:"
msgstr ""
msgstr "Failo tipas:"
#: bookwyrm/templates/book/file_links/add_link_modal.html:48
msgid "Availability:"
msgstr ""
msgstr "Prieinamumas:"
#: bookwyrm/templates/book/file_links/edit_links.html:5
#: bookwyrm/templates/book/file_links/edit_links.html:22
#: bookwyrm/templates/book/file_links/links.html:53
msgid "Edit links"
msgstr ""
msgstr "Redaguoti nuorodas"
#: bookwyrm/templates/book/file_links/edit_links.html:11
#, python-format
msgid "\n"
" Links for \"<em>%(title)s</em>\"\n"
" "
msgstr ""
msgstr "\"<em>%(title)s</em>\" nuorodos\n"
" "
#: bookwyrm/templates/book/file_links/edit_links.html:32
#: bookwyrm/templates/settings/link_domains/link_table.html:6
msgid "URL"
msgstr ""
msgstr "Nuoroda"
#: bookwyrm/templates/book/file_links/edit_links.html:33
#: bookwyrm/templates/settings/link_domains/link_table.html:7
msgid "Added by"
msgstr ""
msgstr "Pridėjo"
#: bookwyrm/templates/book/file_links/edit_links.html:34
#: bookwyrm/templates/settings/link_domains/link_table.html:8
msgid "Filetype"
msgstr ""
msgstr "Failo tipas"
#: bookwyrm/templates/book/file_links/edit_links.html:35
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:25
@ -1148,41 +1147,41 @@ msgstr "Veiksmai"
#: bookwyrm/templates/book/file_links/edit_links.html:53
#: bookwyrm/templates/book/file_links/verification_modal.html:25
msgid "Report spam"
msgstr ""
msgstr "Pranešti apie brukalą"
#: bookwyrm/templates/book/file_links/edit_links.html:97
msgid "No links available for this book."
msgstr ""
msgstr "Šiai knygai nuorodų nėra."
#: bookwyrm/templates/book/file_links/edit_links.html:108
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr ""
msgstr "Pridėti nuorodą į failą"
#: bookwyrm/templates/book/file_links/file_link_page.html:6
msgid "File Links"
msgstr ""
msgstr "Nuorodos į failus"
#: bookwyrm/templates/book/file_links/links.html:9
msgid "Get a copy"
msgstr ""
msgstr "Gauti kopiją"
#: bookwyrm/templates/book/file_links/links.html:47
msgid "No links available"
msgstr ""
msgstr "Nuorodų nėra"
#: bookwyrm/templates/book/file_links/verification_modal.html:5
msgid "Leaving BookWyrm"
msgstr ""
msgstr "Tęsti naršymą ne BookWyrm"
#: bookwyrm/templates/book/file_links/verification_modal.html:11
#, python-format
msgid "This link is taking you to: <code>%(link_url)s</code>.<br> Is that where you'd like to go?"
msgstr ""
msgstr "Nuoroda veda į: <code>%(link_url)s</code>.<br> Ar tikrai norite ten nueiti?"
#: bookwyrm/templates/book/file_links/verification_modal.html:20
msgid "Continue"
msgstr ""
msgstr "Tęsti"
#: bookwyrm/templates/book/publisher_info.html:23
#, python-format
@ -1663,7 +1662,7 @@ msgid "What are you reading?"
msgstr "Ką skaitome?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:162
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:163
msgid "Search for a book"
msgstr "Ieškoti knygos"
@ -1681,9 +1680,9 @@ msgstr "Kai pradedate naudotis %(site_name)s, galite pridėti knygų."
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/groups/members.html:17 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:166
#: bookwyrm/templates/groups/members.html:15
#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1699,7 +1698,7 @@ msgid "Popular on %(site_name)s"
msgstr "%(site_name)s populiaru"
#: bookwyrm/templates/get_started/books.html:58
#: bookwyrm/templates/lists/list.html:179
#: bookwyrm/templates/lists/list.html:180
msgid "No books found"
msgstr "Knygų nerasta"
@ -1804,7 +1803,7 @@ msgstr "Nebegalite atšaukti šio veiksmo"
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
#: bookwyrm/templates/snippets/join_invitation_buttons.html:13
#: bookwyrm/templates/snippets/join_invitation_buttons.html:14
msgid "Delete"
msgstr "Ištrinti"
@ -1824,17 +1823,17 @@ msgstr "Grupės aprašymas:"
msgid "Delete group"
msgstr "Ištrinti grupę"
#: bookwyrm/templates/groups/group.html:22
#: bookwyrm/templates/groups/group.html:21
msgid "Members of this group can create group-curated lists."
msgstr ""
msgstr "Šios grupės nariai gali kurti grupės kuruojamus sąrašus."
#: bookwyrm/templates/groups/group.html:27
#: bookwyrm/templates/groups/group.html:26
#: bookwyrm/templates/lists/create_form.html:5
#: bookwyrm/templates/lists/lists.html:20
msgid "Create List"
msgstr "Sukurti sąrašą"
#: bookwyrm/templates/groups/group.html:40
#: bookwyrm/templates/groups/group.html:39
msgid "This group has no lists"
msgstr "Šioje grupėje nėra sąrašų"
@ -1842,15 +1841,15 @@ msgstr "Šioje grupėje nėra sąrašų"
msgid "Edit group"
msgstr "Redaguoti grupę"
#: bookwyrm/templates/groups/members.html:12
#: bookwyrm/templates/groups/members.html:11
msgid "Search to add a user"
msgstr "Ieškokite, kad pridėtumėte naudotoją"
#: bookwyrm/templates/groups/members.html:33
#: bookwyrm/templates/groups/members.html:32
msgid "Leave group"
msgstr "Išeiti iš grupės"
#: bookwyrm/templates/groups/members.html:55
#: bookwyrm/templates/groups/members.html:54
#: bookwyrm/templates/groups/suggested_users.html:35
#: bookwyrm/templates/snippets/suggested_users.html:31
#: bookwyrm/templates/user/user_preview.html:36
@ -2067,7 +2066,7 @@ msgstr "Atmesti"
#: 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 noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr ""
msgstr "Galite atsisiųsti savo „Goodreads“ duomenis iš <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener noreferrer\">Importavimo ir eksportavimo puslapio</a>, esančio jūsų „Goodreads“ paskyroje."
#: bookwyrm/templates/import/troubleshoot.html:7
msgid "Failed items"
@ -2315,18 +2314,18 @@ msgstr "Ištrinti šį sąrašą?"
msgid "Edit List"
msgstr "Redaguoti sąrašą"
#: bookwyrm/templates/lists/embed-list.html:7
#: bookwyrm/templates/lists/embed-list.html:8
#, python-format
msgid "%(list_name)s, a list by %(owner)s"
msgstr "%(list_name)s, sąrašą sudarė %(owner)s"
#: bookwyrm/templates/lists/embed-list.html:17
#: bookwyrm/templates/lists/embed-list.html:18
#, python-format
msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr "per <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:42
#: bookwyrm/templates/lists/embed-list.html:27
#: bookwyrm/templates/lists/list.html:43
msgid "This list is currently empty"
msgstr "Šiuo metu sąrašas tuščias"
@ -2387,76 +2386,76 @@ msgstr "Sukurti grupę"
msgid "Delete list"
msgstr "Ištrinti sąrašą"
#: bookwyrm/templates/lists/list.html:34
#: bookwyrm/templates/lists/list.html:35
msgid "You successfully suggested a book for this list!"
msgstr "Sėkmingai pasiūlėte knygą šiam sąrašui!"
#: bookwyrm/templates/lists/list.html:36
#: bookwyrm/templates/lists/list.html:37
msgid "You successfully added a book to this list!"
msgstr "Sėkmingai pridėjote knygą į šį sąrašą!"
#: bookwyrm/templates/lists/list.html:80
#: bookwyrm/templates/lists/list.html:81
#, python-format
msgid "Added by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "Pridėjo <a href=\"%(user_path)s\">%(username)s</a>"
#: bookwyrm/templates/lists/list.html:95
#: bookwyrm/templates/lists/list.html:96
msgid "List position"
msgstr "Sąrašo pozicija"
#: bookwyrm/templates/lists/list.html:101
#: bookwyrm/templates/lists/list.html:102
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
msgid "Set"
msgstr "Nustatyti"
#: bookwyrm/templates/lists/list.html:116
#: bookwyrm/templates/snippets/remove_from_group_button.html:19
#: bookwyrm/templates/lists/list.html:117
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr "Pašalinti"
#: bookwyrm/templates/lists/list.html:130
#: bookwyrm/templates/lists/list.html:147
#: bookwyrm/templates/lists/list.html:131
#: bookwyrm/templates/lists/list.html:148
msgid "Sort List"
msgstr "Rūšiuoti sąrašą"
#: bookwyrm/templates/lists/list.html:140
#: bookwyrm/templates/lists/list.html:141
msgid "Direction"
msgstr "Kryptis"
#: bookwyrm/templates/lists/list.html:154
#: bookwyrm/templates/lists/list.html:155
msgid "Add Books"
msgstr "Pridėti knygų"
#: bookwyrm/templates/lists/list.html:156
#: bookwyrm/templates/lists/list.html:157
msgid "Suggest Books"
msgstr "Siūlyti knygų"
#: bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/lists/list.html:168
msgid "search"
msgstr "paieška"
#: bookwyrm/templates/lists/list.html:173
#: bookwyrm/templates/lists/list.html:174
msgid "Clear search"
msgstr "Išvalyti paiešką"
#: bookwyrm/templates/lists/list.html:178
#: bookwyrm/templates/lists/list.html:179
#, python-format
msgid "No books found matching the query \"%(query)s\""
msgstr "Pagal paiešką „%(query)s“ knygų nerasta"
#: bookwyrm/templates/lists/list.html:210
#: bookwyrm/templates/lists/list.html:211
msgid "Suggest"
msgstr "Siūlyti"
#: bookwyrm/templates/lists/list.html:221
#: bookwyrm/templates/lists/list.html:222
msgid "Embed this list on a website"
msgstr "Įdėkite šį sąrašą į tinklalapį"
#: bookwyrm/templates/lists/list.html:229
#: bookwyrm/templates/lists/list.html:230
msgid "Copy embed code"
msgstr "Nukopijuokite įterptinį kodą"
#: bookwyrm/templates/lists/list.html:231
#: bookwyrm/templates/lists/list.html:232
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr "%(list_name)s, sąrašą sudarė %(owner)s, per %(site_name)s"
@ -3523,7 +3522,7 @@ msgstr "Pranešimai"
#: bookwyrm/templates/settings/link_domains/link_domains.html:5
#: bookwyrm/templates/settings/link_domains/link_domains.html:7
msgid "Link Domains"
msgstr ""
msgstr "Susieti domenus"
#: bookwyrm/templates/settings/layout.html:72
msgid "Instance Settings"
@ -3546,23 +3545,23 @@ msgstr ""
#: bookwyrm/templates/settings/link_domains/link_domains.html:45
msgid "Set display name"
msgstr ""
msgstr "Nurodyti pavadinimą"
#: bookwyrm/templates/settings/link_domains/link_domains.html:53
msgid "View links"
msgstr ""
msgstr "Peržiūrėti nuorodas"
#: bookwyrm/templates/settings/link_domains/link_domains.html:96
msgid "No domains currently approved"
msgstr ""
msgstr "Nėra patvirtintų domenų"
#: bookwyrm/templates/settings/link_domains/link_domains.html:98
msgid "No domains currently pending"
msgstr ""
msgstr "Nėra domenų, laukiančių patvirtinimo"
#: bookwyrm/templates/settings/link_domains/link_domains.html:100
msgid "No domains currently blocked"
msgstr ""
msgstr "Šiuo metu užblokuotų domenų nėra"
#: bookwyrm/templates/settings/link_domains/link_table.html:39
msgid "No links available for this domain."
@ -3582,7 +3581,7 @@ msgstr "Būsena ištrinta"
#: bookwyrm/templates/settings/reports/report.html:39
msgid "Reported links"
msgstr ""
msgstr "Raportuotos nuorodos"
#: bookwyrm/templates/settings/reports/report.html:55
msgid "Moderator Comments"
@ -3610,7 +3609,7 @@ msgstr ""
#: bookwyrm/templates/settings/reports/report_links_table.html:17
msgid "Block domain"
msgstr ""
msgstr "Užblokuoti domeną"
#: bookwyrm/templates/settings/reports/report_preview.html:17
msgid "No notes provided"
@ -3865,7 +3864,7 @@ msgstr "Visam laikui ištrintas"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:8
msgid "User Actions"
msgstr ""
msgstr "Nario veiksmai"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:21
msgid "Suspend user"
@ -3889,7 +3888,7 @@ msgstr "Redaguoti lentyną"
#: bookwyrm/templates/shelf/shelf.html:24
msgid "User profile"
msgstr ""
msgstr "Nario profilis"
#: bookwyrm/templates/shelf/shelf.html:39
#: bookwyrm/templates/snippets/translated_shelf_name.html:3
@ -3942,15 +3941,15 @@ msgstr "Baigta"
msgid "This shelf is empty."
msgstr "Ši lentyna tuščia."
#: bookwyrm/templates/snippets/add_to_group_button.html:15
#: bookwyrm/templates/snippets/add_to_group_button.html:16
msgid "Invite"
msgstr "Pakviesti"
#: bookwyrm/templates/snippets/add_to_group_button.html:24
#: bookwyrm/templates/snippets/add_to_group_button.html:25
msgid "Uninvite"
msgstr "Atšaukti kvietimą"
#: bookwyrm/templates/snippets/add_to_group_button.html:28
#: bookwyrm/templates/snippets/add_to_group_button.html:29
#, python-format
msgid "Remove @%(username)s"
msgstr "Pašalinti @%(username)s"
@ -4040,7 +4039,7 @@ msgstr "Galimas turinio atskleidimas!"
msgid "Include spoiler alert"
msgstr "Įdėti įspėjimą apie turinio atskleidimą"
#: bookwyrm/templates/snippets/create_status/layout.html:48
#: bookwyrm/templates/snippets/create_status/layout.html:47
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Komentuoti:"
@ -4049,33 +4048,33 @@ msgstr "Komentuoti:"
msgid "Post"
msgstr "Publikuoti"
#: bookwyrm/templates/snippets/create_status/quotation.html:17
#: bookwyrm/templates/snippets/create_status/quotation.html:16
msgid "Quote:"
msgstr "Citata:"
#: bookwyrm/templates/snippets/create_status/quotation.html:25
#: bookwyrm/templates/snippets/create_status/quotation.html:24
#, python-format
msgid "An excerpt from '%(book_title)s'"
msgstr "Ištrauka iš „%(book_title)s“"
#: bookwyrm/templates/snippets/create_status/quotation.html:32
#: bookwyrm/templates/snippets/create_status/quotation.html:31
msgid "Position:"
msgstr "Pozicija:"
#: bookwyrm/templates/snippets/create_status/quotation.html:45
#: bookwyrm/templates/snippets/create_status/quotation.html:44
msgid "On page:"
msgstr "Puslapyje:"
#: bookwyrm/templates/snippets/create_status/quotation.html:51
#: bookwyrm/templates/snippets/create_status/quotation.html:50
msgid "At percent:"
msgstr "Proc.:"
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/snippets/create_status/review.html:24
#, python-format
msgid "Your review of '%(book_title)s'"
msgstr "Jūsų apžvalga apie „%(book_title)s“"
#: bookwyrm/templates/snippets/create_status/review.html:40
#: bookwyrm/templates/snippets/create_status/review.html:39
msgid "Review:"
msgstr "Atsiliepimas:"
@ -4129,7 +4128,7 @@ msgid "Unfollow"
msgstr "Nebesekti"
#: bookwyrm/templates/snippets/follow_request_buttons.html:7
#: bookwyrm/templates/snippets/join_invitation_buttons.html:8
#: bookwyrm/templates/snippets/join_invitation_buttons.html:9
msgid "Accept"
msgstr "Sutikti"
@ -4177,8 +4176,8 @@ msgstr[3] "įvertinta <em><a href=\"%(path)s\">%(title)s</a></em>: %(display_rat
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s stars): %(review_title)s"
msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@ -4186,7 +4185,7 @@ msgstr[3] ""
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:12
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\": %(review_title)s"
msgid "Review of \"%(book_title)s\": %(review_title)s"
msgstr ""
#: bookwyrm/templates/snippets/goal_form.html:4
@ -4257,11 +4256,11 @@ msgstr "Tik sekėjai"
msgid "Post privacy"
msgstr "Įrašo privatumas"
#: bookwyrm/templates/snippets/rate_action.html:4
#: bookwyrm/templates/snippets/rate_action.html:5
msgid "Leave a rating"
msgstr "Palikti įvertinimą"
#: bookwyrm/templates/snippets/rate_action.html:19
#: bookwyrm/templates/snippets/rate_action.html:20
msgid "Rate"
msgstr "Įvertinti"
@ -4355,29 +4354,29 @@ msgstr "Pašalinti iš %(name)s"
msgid "Finish reading"
msgstr "Baigti skaityti"
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/status/content_status.html:73
msgid "Content warning"
msgstr "Įspėjimas dėl turinio"
#: bookwyrm/templates/snippets/status/content_status.html:79
#: bookwyrm/templates/snippets/status/content_status.html:80
msgid "Show status"
msgstr "Rodyti būseną"
#: bookwyrm/templates/snippets/status/content_status.html:101
#: bookwyrm/templates/snippets/status/content_status.html:102
#, python-format
msgid "(Page %(page)s)"
msgstr "(Psl. %(page)s)"
#: bookwyrm/templates/snippets/status/content_status.html:103
#: bookwyrm/templates/snippets/status/content_status.html:104
#, python-format
msgid "(%(percent)s%%)"
msgstr "(%(percent)s%%)"
#: bookwyrm/templates/snippets/status/content_status.html:125
#: bookwyrm/templates/snippets/status/content_status.html:126
msgid "Open image in new window"
msgstr "Atidaryti paveikslėlį naujame lange"
#: bookwyrm/templates/snippets/status/content_status.html:144
#: bookwyrm/templates/snippets/status/content_status.html:145
msgid "Hide status"
msgstr "Slėpti būseną"

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: 2022-01-17 19:26+0000\n"
"PO-Revision-Date: 2022-01-17 19:57\n"
"POT-Creation-Date: 2022-01-20 17:58+0000\n"
"PO-Revision-Date: 2022-01-20 22:34\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Norwegian\n"
"Language: no\n"
@ -56,11 +56,11 @@ msgstr "Boktittel"
#: bookwyrm/forms.py:485 bookwyrm/templates/shelf/shelf.html:155
#: bookwyrm/templates/shelf/shelf.html:187
#: bookwyrm/templates/snippets/create_status/review.html:33
#: bookwyrm/templates/snippets/create_status/review.html:32
msgid "Rating"
msgstr "Vurdering"
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:134
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:135
msgid "Sort By"
msgstr "Sorter etter"
@ -224,69 +224,69 @@ msgstr "Sitater"
msgid "Everything else"
msgstr "Andre ting"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home Timeline"
msgstr "Lokal tidslinje"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home"
msgstr "Hjem"
#: bookwyrm/settings.py:122
#: bookwyrm/settings.py:174
msgid "Books Timeline"
msgstr "Boktidslinja"
#: bookwyrm/settings.py:122 bookwyrm/templates/search/layout.html:21
#: bookwyrm/settings.py:174 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Bøker"
#: bookwyrm/settings.py:196
#: bookwyrm/settings.py:248
msgid "English"
msgstr "English (Engelsk)"
#: bookwyrm/settings.py:197
#: bookwyrm/settings.py:249
msgid "Deutsch (German)"
msgstr "Deutsch (Tysk)"
#: bookwyrm/settings.py:198
#: bookwyrm/settings.py:250
msgid "Español (Spanish)"
msgstr "Español (Spansk)"
#: bookwyrm/settings.py:199
#: bookwyrm/settings.py:251
msgid "Galego (Galician)"
msgstr "Galego (Gallisk)"
#: bookwyrm/settings.py:200
#: bookwyrm/settings.py:252
msgid "Italiano (Italian)"
msgstr "Italiano (Italiensk)"
#: bookwyrm/settings.py:201
#: bookwyrm/settings.py:253
msgid "Français (French)"
msgstr "Français (Fransk)"
#: bookwyrm/settings.py:202
#: bookwyrm/settings.py:254
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Litauisk)"
#: bookwyrm/settings.py:203
#: bookwyrm/settings.py:255
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norsk)"
#: bookwyrm/settings.py:204
#: bookwyrm/settings.py:256
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português - Brasil (Brasiliansk portugisisk)"
#: bookwyrm/settings.py:205
#: bookwyrm/settings.py:257
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Europeisk Portugisisk)"
#: bookwyrm/settings.py:206
#: bookwyrm/settings.py:258
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Forenklet kinesisk)"
#: bookwyrm/settings.py:207
#: bookwyrm/settings.py:259
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Tradisjonelt kinesisk)"
@ -351,12 +351,8 @@ msgstr "Møt administratorene"
#: bookwyrm/templates/about/about.html:98
#, python-format
msgid "\n"
" %(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior.\n"
" "
msgstr "\n"
" %(site_name)s sine moderatorer og administratorer holder nettsida oppe og tilgjengelig, håndhever <a href=\"coc_path\">atferdskoden</a>, og svarer på brukernes rapporterer om spam og dårlig atferd.\n"
" "
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior."
msgstr ""
#: bookwyrm/templates/about/about.html:112
msgid "Moderator"
@ -428,7 +424,7 @@ msgid "Copy address"
msgstr "Kopiér adresse"
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:230
#: bookwyrm/templates/lists/list.html:231
msgid "Copied!"
msgstr "Kopiert!"
@ -497,7 +493,7 @@ msgstr "Den korteste teksten lest i år…"
#: bookwyrm/templates/annual_summary/layout.html:245
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "av"
@ -733,9 +729,9 @@ msgstr "Laster inn data kobler til <strong>%(source_name)s</strong> og finner me
#: bookwyrm/templates/author/sync_modal.html:22
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/book/sync_modal.html:22
#: bookwyrm/templates/groups/members.html:30
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
msgid "Confirm"
msgstr "Bekreft"
@ -819,8 +815,8 @@ msgid "Places"
msgstr "Steder"
#: bookwyrm/templates/book/book.html:348
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:10
#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:11
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -834,7 +830,7 @@ msgstr "Legg til i liste"
#: bookwyrm/templates/book/book.html:369
#: bookwyrm/templates/book/cover_add_modal.html:31
#: bookwyrm/templates/lists/list.html:208
#: bookwyrm/templates/lists/list.html:209
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
msgid "Add"
@ -936,7 +932,7 @@ msgid "Back"
msgstr "Tilbake"
#: bookwyrm/templates/book/edit/edit_book_form.html:21
#: bookwyrm/templates/snippets/create_status/review.html:16
#: bookwyrm/templates/snippets/create_status/review.html:15
msgid "Title:"
msgstr "Tittel:"
@ -1651,7 +1647,7 @@ msgid "What are you reading?"
msgstr "Hva er det du leser nå?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:162
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:163
msgid "Search for a book"
msgstr "Søk etter en bok"
@ -1669,9 +1665,9 @@ msgstr "Du kan legge til bøker når du begynner å bruke %(site_name)s."
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/groups/members.html:17 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:166
#: bookwyrm/templates/groups/members.html:15
#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1687,7 +1683,7 @@ msgid "Popular on %(site_name)s"
msgstr "Populært på %(site_name)s"
#: bookwyrm/templates/get_started/books.html:58
#: bookwyrm/templates/lists/list.html:179
#: bookwyrm/templates/lists/list.html:180
msgid "No books found"
msgstr "Ingen bøker funnet"
@ -1792,7 +1788,7 @@ msgstr "Denne handlingen er endelig"
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
#: bookwyrm/templates/snippets/join_invitation_buttons.html:13
#: bookwyrm/templates/snippets/join_invitation_buttons.html:14
msgid "Delete"
msgstr "Slett"
@ -1812,17 +1808,17 @@ msgstr "Gruppebeskrivelse:"
msgid "Delete group"
msgstr "Slett gruppa"
#: bookwyrm/templates/groups/group.html:22
#: bookwyrm/templates/groups/group.html:21
msgid "Members of this group can create group-curated lists."
msgstr "Medlemmer av denne gruppen kan opprette gruppekontrollerte lister."
#: bookwyrm/templates/groups/group.html:27
#: bookwyrm/templates/groups/group.html:26
#: bookwyrm/templates/lists/create_form.html:5
#: bookwyrm/templates/lists/lists.html:20
msgid "Create List"
msgstr "Opprett liste"
#: bookwyrm/templates/groups/group.html:40
#: bookwyrm/templates/groups/group.html:39
msgid "This group has no lists"
msgstr "Denne gruppa har ingen lister"
@ -1830,15 +1826,15 @@ msgstr "Denne gruppa har ingen lister"
msgid "Edit group"
msgstr "Rediger gruppe"
#: bookwyrm/templates/groups/members.html:12
#: bookwyrm/templates/groups/members.html:11
msgid "Search to add a user"
msgstr "Søk for å legge til et medlem"
#: bookwyrm/templates/groups/members.html:33
#: bookwyrm/templates/groups/members.html:32
msgid "Leave group"
msgstr "Forlat gruppa"
#: bookwyrm/templates/groups/members.html:55
#: bookwyrm/templates/groups/members.html:54
#: bookwyrm/templates/groups/suggested_users.html:35
#: bookwyrm/templates/snippets/suggested_users.html:31
#: bookwyrm/templates/user/user_preview.html:36
@ -2295,18 +2291,18 @@ msgstr "Slett denne lista?"
msgid "Edit List"
msgstr "Redigér lista"
#: bookwyrm/templates/lists/embed-list.html:7
#: bookwyrm/templates/lists/embed-list.html:8
#, python-format
msgid "%(list_name)s, a list by %(owner)s"
msgstr "%(list_name)s, ei liste av %(owner)s"
#: bookwyrm/templates/lists/embed-list.html:17
#: bookwyrm/templates/lists/embed-list.html:18
#, python-format
msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr "på <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:42
#: bookwyrm/templates/lists/embed-list.html:27
#: bookwyrm/templates/lists/list.html:43
msgid "This list is currently empty"
msgstr "Denne lista er for tida tom"
@ -2367,76 +2363,76 @@ msgstr "Opprett ei gruppe"
msgid "Delete list"
msgstr "Slett liste"
#: bookwyrm/templates/lists/list.html:34
#: bookwyrm/templates/lists/list.html:35
msgid "You successfully suggested a book for this list!"
msgstr "Du har nå foreslått en bok for denne lista!"
#: bookwyrm/templates/lists/list.html:36
#: bookwyrm/templates/lists/list.html:37
msgid "You successfully added a book to this list!"
msgstr "Du har nå lagt til ei bok i denne lista!"
#: bookwyrm/templates/lists/list.html:80
#: bookwyrm/templates/lists/list.html:81
#, python-format
msgid "Added by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "Lagt til av <a href=\"%(user_path)s\">%(username)s</a>"
#: bookwyrm/templates/lists/list.html:95
#: bookwyrm/templates/lists/list.html:96
msgid "List position"
msgstr "Listeposisjon"
#: bookwyrm/templates/lists/list.html:101
#: bookwyrm/templates/lists/list.html:102
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
msgid "Set"
msgstr "Bruk"
#: bookwyrm/templates/lists/list.html:116
#: bookwyrm/templates/snippets/remove_from_group_button.html:19
#: bookwyrm/templates/lists/list.html:117
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr "Fjern"
#: bookwyrm/templates/lists/list.html:130
#: bookwyrm/templates/lists/list.html:147
#: bookwyrm/templates/lists/list.html:131
#: bookwyrm/templates/lists/list.html:148
msgid "Sort List"
msgstr "Sorter liste"
#: bookwyrm/templates/lists/list.html:140
#: bookwyrm/templates/lists/list.html:141
msgid "Direction"
msgstr "Retning"
#: bookwyrm/templates/lists/list.html:154
#: bookwyrm/templates/lists/list.html:155
msgid "Add Books"
msgstr "Legg til bøker"
#: bookwyrm/templates/lists/list.html:156
#: bookwyrm/templates/lists/list.html:157
msgid "Suggest Books"
msgstr "Foreslå bøker"
#: bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/lists/list.html:168
msgid "search"
msgstr "søk"
#: bookwyrm/templates/lists/list.html:173
#: bookwyrm/templates/lists/list.html:174
msgid "Clear search"
msgstr "Nullstill søk"
#: bookwyrm/templates/lists/list.html:178
#: bookwyrm/templates/lists/list.html:179
#, python-format
msgid "No books found matching the query \"%(query)s\""
msgstr "Ingen bøker funnet for søket\"%(query)s\""
#: bookwyrm/templates/lists/list.html:210
#: bookwyrm/templates/lists/list.html:211
msgid "Suggest"
msgstr "Foreslå"
#: bookwyrm/templates/lists/list.html:221
#: bookwyrm/templates/lists/list.html:222
msgid "Embed this list on a website"
msgstr "Legg denne lista inn på et nettsted"
#: bookwyrm/templates/lists/list.html:229
#: bookwyrm/templates/lists/list.html:230
msgid "Copy embed code"
msgstr "Kopier kode som legger inn lista"
#: bookwyrm/templates/lists/list.html:231
#: bookwyrm/templates/lists/list.html:232
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr "%(list_name)s, en liste av %(owner)s på %(site_name)s"
@ -3912,15 +3908,15 @@ msgstr "Fullført"
msgid "This shelf is empty."
msgstr "Denne hylla er tom."
#: bookwyrm/templates/snippets/add_to_group_button.html:15
#: bookwyrm/templates/snippets/add_to_group_button.html:16
msgid "Invite"
msgstr "Invitér"
#: bookwyrm/templates/snippets/add_to_group_button.html:24
#: bookwyrm/templates/snippets/add_to_group_button.html:25
msgid "Uninvite"
msgstr "Avlys invitasjon"
#: bookwyrm/templates/snippets/add_to_group_button.html:28
#: bookwyrm/templates/snippets/add_to_group_button.html:29
#, python-format
msgid "Remove @%(username)s"
msgstr "Fjern %(username)s"
@ -4008,7 +4004,7 @@ msgstr "Spoilers forut!"
msgid "Include spoiler alert"
msgstr "Inkluder spoiler-varsel"
#: bookwyrm/templates/snippets/create_status/layout.html:48
#: bookwyrm/templates/snippets/create_status/layout.html:47
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Kommentar:"
@ -4017,33 +4013,33 @@ msgstr "Kommentar:"
msgid "Post"
msgstr "Innlegg"
#: bookwyrm/templates/snippets/create_status/quotation.html:17
#: bookwyrm/templates/snippets/create_status/quotation.html:16
msgid "Quote:"
msgstr "Sitat:"
#: bookwyrm/templates/snippets/create_status/quotation.html:25
#: bookwyrm/templates/snippets/create_status/quotation.html:24
#, python-format
msgid "An excerpt from '%(book_title)s'"
msgstr "En utdrag fra '%(book_title)s'"
#: bookwyrm/templates/snippets/create_status/quotation.html:32
#: bookwyrm/templates/snippets/create_status/quotation.html:31
msgid "Position:"
msgstr "Plassering:"
#: bookwyrm/templates/snippets/create_status/quotation.html:45
#: bookwyrm/templates/snippets/create_status/quotation.html:44
msgid "On page:"
msgstr "På side:"
#: bookwyrm/templates/snippets/create_status/quotation.html:51
#: bookwyrm/templates/snippets/create_status/quotation.html:50
msgid "At percent:"
msgstr "Ved prosent:"
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/snippets/create_status/review.html:24
#, python-format
msgid "Your review of '%(book_title)s'"
msgstr "Din anmeldelse av '%(book_title)s"
#: bookwyrm/templates/snippets/create_status/review.html:40
#: bookwyrm/templates/snippets/create_status/review.html:39
msgid "Review:"
msgstr "Anmeldelse:"
@ -4097,7 +4093,7 @@ msgid "Unfollow"
msgstr "Slutt å følge"
#: bookwyrm/templates/snippets/follow_request_buttons.html:7
#: bookwyrm/templates/snippets/join_invitation_buttons.html:8
#: bookwyrm/templates/snippets/join_invitation_buttons.html:9
msgid "Accept"
msgstr "Godta"
@ -4137,14 +4133,14 @@ msgstr[1] "vurderte <em><a href=\"%(path)s\">%(title)s</a></em> til: %(display_r
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s stars): %(review_title)s"
msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:12
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\": %(review_title)s"
msgid "Review of \"%(book_title)s\": %(review_title)s"
msgstr ""
#: bookwyrm/templates/snippets/goal_form.html:4
@ -4215,11 +4211,11 @@ msgstr "Kun følgere"
msgid "Post privacy"
msgstr "Delingsinstilling for post"
#: bookwyrm/templates/snippets/rate_action.html:4
#: bookwyrm/templates/snippets/rate_action.html:5
msgid "Leave a rating"
msgstr "Legg inn en vurdering"
#: bookwyrm/templates/snippets/rate_action.html:19
#: bookwyrm/templates/snippets/rate_action.html:20
msgid "Rate"
msgstr "Vurdér"
@ -4313,29 +4309,29 @@ msgstr "Fjern fra %(name)s"
msgid "Finish reading"
msgstr "Fullfør lesing"
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/status/content_status.html:73
msgid "Content warning"
msgstr "Varsel om følsomt innhold"
#: bookwyrm/templates/snippets/status/content_status.html:79
#: bookwyrm/templates/snippets/status/content_status.html:80
msgid "Show status"
msgstr "Vis status"
#: bookwyrm/templates/snippets/status/content_status.html:101
#: bookwyrm/templates/snippets/status/content_status.html:102
#, python-format
msgid "(Page %(page)s)"
msgstr "(side %(page)s)"
#: bookwyrm/templates/snippets/status/content_status.html:103
#: bookwyrm/templates/snippets/status/content_status.html:104
#, python-format
msgid "(%(percent)s%%)"
msgstr "(%(percent)s%%)"
#: bookwyrm/templates/snippets/status/content_status.html:125
#: bookwyrm/templates/snippets/status/content_status.html:126
msgid "Open image in new window"
msgstr "Åpne bilde i nytt vindu"
#: bookwyrm/templates/snippets/status/content_status.html:144
#: bookwyrm/templates/snippets/status/content_status.html:145
msgid "Hide status"
msgstr "Skjul status"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-17 19:26+0000\n"
"PO-Revision-Date: 2022-01-18 14:10\n"
"POT-Creation-Date: 2022-01-20 17:58+0000\n"
"PO-Revision-Date: 2022-01-20 22:34\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt\n"
@ -56,11 +56,11 @@ msgstr "Título do livro"
#: bookwyrm/forms.py:485 bookwyrm/templates/shelf/shelf.html:155
#: bookwyrm/templates/shelf/shelf.html:187
#: bookwyrm/templates/snippets/create_status/review.html:33
#: bookwyrm/templates/snippets/create_status/review.html:32
msgid "Rating"
msgstr "Avaliação"
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:134
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:135
msgid "Sort By"
msgstr "Organizar por"
@ -224,69 +224,69 @@ msgstr "Citações"
msgid "Everything else"
msgstr "Todo o resto"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home Timeline"
msgstr "Linha do tempo"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home"
msgstr "Página inicial"
#: bookwyrm/settings.py:122
#: bookwyrm/settings.py:174
msgid "Books Timeline"
msgstr "Linha do tempo dos livros"
#: bookwyrm/settings.py:122 bookwyrm/templates/search/layout.html:21
#: bookwyrm/settings.py:174 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Livros"
#: bookwyrm/settings.py:196
#: bookwyrm/settings.py:248
msgid "English"
msgstr "English (Inglês)"
#: bookwyrm/settings.py:197
#: bookwyrm/settings.py:249
msgid "Deutsch (German)"
msgstr "Deutsch (Alemão)"
#: bookwyrm/settings.py:198
#: bookwyrm/settings.py:250
msgid "Español (Spanish)"
msgstr "Español (Espanhol)"
#: bookwyrm/settings.py:199
#: bookwyrm/settings.py:251
msgid "Galego (Galician)"
msgstr "Galego (Galego)"
#: bookwyrm/settings.py:200
#: bookwyrm/settings.py:252
msgid "Italiano (Italian)"
msgstr "Italiano (Italiano)"
#: bookwyrm/settings.py:201
#: bookwyrm/settings.py:253
msgid "Français (French)"
msgstr "Français (Francês)"
#: bookwyrm/settings.py:202
#: bookwyrm/settings.py:254
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituano)"
#: bookwyrm/settings.py:203
#: bookwyrm/settings.py:255
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norueguês)"
#: bookwyrm/settings.py:204
#: bookwyrm/settings.py:256
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Português do Brasil)"
#: bookwyrm/settings.py:205
#: bookwyrm/settings.py:257
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Português Europeu)"
#: bookwyrm/settings.py:206
#: bookwyrm/settings.py:258
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chinês simplificado)"
#: bookwyrm/settings.py:207
#: bookwyrm/settings.py:259
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinês tradicional)"
@ -351,11 +351,8 @@ msgstr "Conheça a administração"
#: bookwyrm/templates/about/about.html:98
#, python-format
msgid "\n"
" %(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior.\n"
" "
msgstr "\n"
" Moderadores/as e administradores/as da instância %(site_name)s mantêm o site em funcionamento, aplicam o <a href=\"coc_path\">código de conduta</a> e respondem às denúncias de spam e mau comportamento na rede. "
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior."
msgstr "Moderadores/as e administradores/as de %(site_name)s mantêm o site funcionando, aplicam o <a href=\"coc_path\">código de conduta</a> e respondem quando usuários denunciam spam e mau comportamento."
#: bookwyrm/templates/about/about.html:112
msgid "Moderator"
@ -427,7 +424,7 @@ msgid "Copy address"
msgstr "Copiar endereço"
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:230
#: bookwyrm/templates/lists/list.html:231
msgid "Copied!"
msgstr "Copiado!"
@ -496,7 +493,7 @@ msgstr "A leitura mais curta do ano…"
#: bookwyrm/templates/annual_summary/layout.html:245
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "de"
@ -732,9 +729,9 @@ msgstr "Para carregar informações nos conectaremos a <strong>%(source_name)s</
#: bookwyrm/templates/author/sync_modal.html:22
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/book/sync_modal.html:22
#: bookwyrm/templates/groups/members.html:30
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
msgid "Confirm"
msgstr "Confirmar"
@ -818,8 +815,8 @@ msgid "Places"
msgstr "Lugares"
#: bookwyrm/templates/book/book.html:348
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:10
#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:11
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -833,7 +830,7 @@ msgstr "Adicionar à lista"
#: bookwyrm/templates/book/book.html:369
#: bookwyrm/templates/book/cover_add_modal.html:31
#: bookwyrm/templates/lists/list.html:208
#: bookwyrm/templates/lists/list.html:209
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
msgid "Add"
@ -935,7 +932,7 @@ msgid "Back"
msgstr "Voltar"
#: bookwyrm/templates/book/edit/edit_book_form.html:21
#: bookwyrm/templates/snippets/create_status/review.html:16
#: bookwyrm/templates/snippets/create_status/review.html:15
msgid "Title:"
msgstr "Título:"
@ -1652,7 +1649,7 @@ msgid "What are you reading?"
msgstr "O que você está lendo?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:162
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:163
msgid "Search for a book"
msgstr "Pesquisar livro"
@ -1670,9 +1667,9 @@ msgstr "Você pode adicionar livros quando começar a usar o %(site_name)s."
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/groups/members.html:17 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:166
#: bookwyrm/templates/groups/members.html:15
#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1688,7 +1685,7 @@ msgid "Popular on %(site_name)s"
msgstr "Popular em %(site_name)s"
#: bookwyrm/templates/get_started/books.html:58
#: bookwyrm/templates/lists/list.html:179
#: bookwyrm/templates/lists/list.html:180
msgid "No books found"
msgstr "Nenhum livro encontrado"
@ -1793,7 +1790,7 @@ msgstr "Esta ação não pode ser desfeita"
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
#: bookwyrm/templates/snippets/join_invitation_buttons.html:13
#: bookwyrm/templates/snippets/join_invitation_buttons.html:14
msgid "Delete"
msgstr "Excluir"
@ -1813,17 +1810,17 @@ msgstr "Descrição do grupo:"
msgid "Delete group"
msgstr "Excluir grupo"
#: bookwyrm/templates/groups/group.html:22
#: bookwyrm/templates/groups/group.html:21
msgid "Members of this group can create group-curated lists."
msgstr "Membros deste grupo podem criar listas organizadas coletivamente."
#: bookwyrm/templates/groups/group.html:27
#: bookwyrm/templates/groups/group.html:26
#: bookwyrm/templates/lists/create_form.html:5
#: bookwyrm/templates/lists/lists.html:20
msgid "Create List"
msgstr "Criar lista"
#: bookwyrm/templates/groups/group.html:40
#: bookwyrm/templates/groups/group.html:39
msgid "This group has no lists"
msgstr "Este grupo não tem listas"
@ -1831,15 +1828,15 @@ msgstr "Este grupo não tem listas"
msgid "Edit group"
msgstr "Editar grupo"
#: bookwyrm/templates/groups/members.html:12
#: bookwyrm/templates/groups/members.html:11
msgid "Search to add a user"
msgstr "Pesquisar usuário para adicionar"
#: bookwyrm/templates/groups/members.html:33
#: bookwyrm/templates/groups/members.html:32
msgid "Leave group"
msgstr "Sair do grupo"
#: bookwyrm/templates/groups/members.html:55
#: bookwyrm/templates/groups/members.html:54
#: bookwyrm/templates/groups/suggested_users.html:35
#: bookwyrm/templates/snippets/suggested_users.html:31
#: bookwyrm/templates/user/user_preview.html:36
@ -2296,18 +2293,18 @@ msgstr "Deletar esta lista?"
msgid "Edit List"
msgstr "Editar lista"
#: bookwyrm/templates/lists/embed-list.html:7
#: bookwyrm/templates/lists/embed-list.html:8
#, python-format
msgid "%(list_name)s, a list by %(owner)s"
msgstr "%(list_name)s, uma lista de %(owner)s"
#: bookwyrm/templates/lists/embed-list.html:17
#: bookwyrm/templates/lists/embed-list.html:18
#, python-format
msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr "em <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:42
#: bookwyrm/templates/lists/embed-list.html:27
#: bookwyrm/templates/lists/list.html:43
msgid "This list is currently empty"
msgstr "Esta lista está vazia"
@ -2368,76 +2365,76 @@ msgstr "Criar grupo"
msgid "Delete list"
msgstr "Excluir lista"
#: bookwyrm/templates/lists/list.html:34
#: bookwyrm/templates/lists/list.html:35
msgid "You successfully suggested a book for this list!"
msgstr "Você sugeriu um livro para esta lista com sucesso!"
#: bookwyrm/templates/lists/list.html:36
#: bookwyrm/templates/lists/list.html:37
msgid "You successfully added a book to this list!"
msgstr "Você adicionou um livro a esta lista com sucesso!"
#: bookwyrm/templates/lists/list.html:80
#: bookwyrm/templates/lists/list.html:81
#, python-format
msgid "Added by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "Adicionado por <a href=\"%(user_path)s\">%(username)s</a>"
#: bookwyrm/templates/lists/list.html:95
#: bookwyrm/templates/lists/list.html:96
msgid "List position"
msgstr "Posição na lista"
#: bookwyrm/templates/lists/list.html:101
#: bookwyrm/templates/lists/list.html:102
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
msgid "Set"
msgstr "Definir"
#: bookwyrm/templates/lists/list.html:116
#: bookwyrm/templates/snippets/remove_from_group_button.html:19
#: bookwyrm/templates/lists/list.html:117
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr "Remover"
#: bookwyrm/templates/lists/list.html:130
#: bookwyrm/templates/lists/list.html:147
#: bookwyrm/templates/lists/list.html:131
#: bookwyrm/templates/lists/list.html:148
msgid "Sort List"
msgstr "Ordenar lista"
#: bookwyrm/templates/lists/list.html:140
#: bookwyrm/templates/lists/list.html:141
msgid "Direction"
msgstr "Sentido"
#: bookwyrm/templates/lists/list.html:154
#: bookwyrm/templates/lists/list.html:155
msgid "Add Books"
msgstr "Adicionar livros"
#: bookwyrm/templates/lists/list.html:156
#: bookwyrm/templates/lists/list.html:157
msgid "Suggest Books"
msgstr "Sugerir livros"
#: bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/lists/list.html:168
msgid "search"
msgstr "pesquisar"
#: bookwyrm/templates/lists/list.html:173
#: bookwyrm/templates/lists/list.html:174
msgid "Clear search"
msgstr "Limpar pesquisa"
#: bookwyrm/templates/lists/list.html:178
#: bookwyrm/templates/lists/list.html:179
#, python-format
msgid "No books found matching the query \"%(query)s\""
msgstr "Nenhum livro encontrado para \"%(query)s\""
#: bookwyrm/templates/lists/list.html:210
#: bookwyrm/templates/lists/list.html:211
msgid "Suggest"
msgstr "Sugerir"
#: bookwyrm/templates/lists/list.html:221
#: bookwyrm/templates/lists/list.html:222
msgid "Embed this list on a website"
msgstr "Incorpore esta lista em um site"
#: bookwyrm/templates/lists/list.html:229
#: bookwyrm/templates/lists/list.html:230
msgid "Copy embed code"
msgstr "Copiar código de incorporação"
#: bookwyrm/templates/lists/list.html:231
#: bookwyrm/templates/lists/list.html:232
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr "%(list_name)s, uma lista de %(owner)s em %(site_name)s"
@ -3913,15 +3910,15 @@ msgstr "Terminado"
msgid "This shelf is empty."
msgstr "Esta estante está vazia."
#: bookwyrm/templates/snippets/add_to_group_button.html:15
#: bookwyrm/templates/snippets/add_to_group_button.html:16
msgid "Invite"
msgstr "Convidar"
#: bookwyrm/templates/snippets/add_to_group_button.html:24
#: bookwyrm/templates/snippets/add_to_group_button.html:25
msgid "Uninvite"
msgstr "Desconvidar"
#: bookwyrm/templates/snippets/add_to_group_button.html:28
#: bookwyrm/templates/snippets/add_to_group_button.html:29
#, python-format
msgid "Remove @%(username)s"
msgstr "Excluir @%(username)s"
@ -4009,7 +4006,7 @@ msgstr "Alerta de spoiler!"
msgid "Include spoiler alert"
msgstr "Incluir alerta de spoiler"
#: bookwyrm/templates/snippets/create_status/layout.html:48
#: bookwyrm/templates/snippets/create_status/layout.html:47
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Comentário:"
@ -4018,33 +4015,33 @@ msgstr "Comentário:"
msgid "Post"
msgstr "Publicar"
#: bookwyrm/templates/snippets/create_status/quotation.html:17
#: bookwyrm/templates/snippets/create_status/quotation.html:16
msgid "Quote:"
msgstr "Citação:"
#: bookwyrm/templates/snippets/create_status/quotation.html:25
#: bookwyrm/templates/snippets/create_status/quotation.html:24
#, python-format
msgid "An excerpt from '%(book_title)s'"
msgstr "Um trecho de '%(book_title)s'"
#: bookwyrm/templates/snippets/create_status/quotation.html:32
#: bookwyrm/templates/snippets/create_status/quotation.html:31
msgid "Position:"
msgstr "Posição:"
#: bookwyrm/templates/snippets/create_status/quotation.html:45
#: bookwyrm/templates/snippets/create_status/quotation.html:44
msgid "On page:"
msgstr "Na página:"
#: bookwyrm/templates/snippets/create_status/quotation.html:51
#: bookwyrm/templates/snippets/create_status/quotation.html:50
msgid "At percent:"
msgstr "Na porcentagem:"
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/snippets/create_status/review.html:24
#, python-format
msgid "Your review of '%(book_title)s'"
msgstr "Sua resenha de '%(book_title)s'"
#: bookwyrm/templates/snippets/create_status/review.html:40
#: bookwyrm/templates/snippets/create_status/review.html:39
msgid "Review:"
msgstr "Resenha:"
@ -4098,7 +4095,7 @@ msgid "Unfollow"
msgstr "Deixar de seguir"
#: bookwyrm/templates/snippets/follow_request_buttons.html:7
#: bookwyrm/templates/snippets/join_invitation_buttons.html:8
#: bookwyrm/templates/snippets/join_invitation_buttons.html:9
msgid "Accept"
msgstr "Aceitar"
@ -4138,15 +4135,15 @@ msgstr[1] "avaliou <em><a href=\"%(path)s\">%(title)s</a></em>: %(display_rating
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] "Resenha de \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s estrela): %(review_title)s"
msgstr[1] "Resenha de \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s estrelas): %(review_title)s"
msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] "Resenha de \"%(book_title)s\" (%(display_rating)s estrela): %(review_title)s"
msgstr[1] "Resenha de \"%(book_title)s\" (%(display_rating)s estrelas): %(review_title)s"
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:12
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\": %(review_title)s"
msgstr "Resenha de \"<a href='%(book_path)s'>%(book_title)s</a>\": %(review_title)s"
msgid "Review of \"%(book_title)s\": %(review_title)s"
msgstr "Resenha de \"%(book_title)s\": %(review_title)s"
#: bookwyrm/templates/snippets/goal_form.html:4
#, python-format
@ -4216,11 +4213,11 @@ msgstr "Apenas seguidores"
msgid "Post privacy"
msgstr "Privacidade da publicação"
#: bookwyrm/templates/snippets/rate_action.html:4
#: bookwyrm/templates/snippets/rate_action.html:5
msgid "Leave a rating"
msgstr "Deixe uma avaliação"
#: bookwyrm/templates/snippets/rate_action.html:19
#: bookwyrm/templates/snippets/rate_action.html:20
msgid "Rate"
msgstr "Avaliar"
@ -4314,29 +4311,29 @@ msgstr "Remover de %(name)s"
msgid "Finish reading"
msgstr "Terminar de ler"
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/status/content_status.html:73
msgid "Content warning"
msgstr "Aviso de conteúdo"
#: bookwyrm/templates/snippets/status/content_status.html:79
#: bookwyrm/templates/snippets/status/content_status.html:80
msgid "Show status"
msgstr "Mostrar publicação"
#: bookwyrm/templates/snippets/status/content_status.html:101
#: bookwyrm/templates/snippets/status/content_status.html:102
#, python-format
msgid "(Page %(page)s)"
msgstr "(Página %(page)s)"
#: bookwyrm/templates/snippets/status/content_status.html:103
#: bookwyrm/templates/snippets/status/content_status.html:104
#, python-format
msgid "(%(percent)s%%)"
msgstr "(%(percent)s%%)"
#: bookwyrm/templates/snippets/status/content_status.html:125
#: bookwyrm/templates/snippets/status/content_status.html:126
msgid "Open image in new window"
msgstr "Abrir imagem em nova janela"
#: bookwyrm/templates/snippets/status/content_status.html:144
#: bookwyrm/templates/snippets/status/content_status.html:145
msgid "Hide status"
msgstr "Esconder publicação"

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: 2022-01-17 19:26+0000\n"
"PO-Revision-Date: 2022-01-17 19:57\n"
"POT-Creation-Date: 2022-01-20 17:58+0000\n"
"PO-Revision-Date: 2022-01-20 22:34\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Portuguese\n"
"Language: pt\n"
@ -56,11 +56,11 @@ msgstr "Título do livro"
#: bookwyrm/forms.py:485 bookwyrm/templates/shelf/shelf.html:155
#: bookwyrm/templates/shelf/shelf.html:187
#: bookwyrm/templates/snippets/create_status/review.html:33
#: bookwyrm/templates/snippets/create_status/review.html:32
msgid "Rating"
msgstr "Classificação"
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:134
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:135
msgid "Sort By"
msgstr "Ordenar Por"
@ -224,69 +224,69 @@ msgstr "Citações"
msgid "Everything else"
msgstr "Tudo o resto"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home Timeline"
msgstr "Cronograma Inicial"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home"
msgstr "Início"
#: bookwyrm/settings.py:122
#: bookwyrm/settings.py:174
msgid "Books Timeline"
msgstr "Cronograma de Livros"
#: bookwyrm/settings.py:122 bookwyrm/templates/search/layout.html:21
#: bookwyrm/settings.py:174 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Livros"
#: bookwyrm/settings.py:196
#: bookwyrm/settings.py:248
msgid "English"
msgstr "Inglês"
#: bookwyrm/settings.py:197
#: bookwyrm/settings.py:249
msgid "Deutsch (German)"
msgstr "Deutsch (Alemão)"
#: bookwyrm/settings.py:198
#: bookwyrm/settings.py:250
msgid "Español (Spanish)"
msgstr "Español (Espanhol)"
#: bookwyrm/settings.py:199
#: bookwyrm/settings.py:251
msgid "Galego (Galician)"
msgstr "Galego (Galician)"
#: bookwyrm/settings.py:200
#: bookwyrm/settings.py:252
msgid "Italiano (Italian)"
msgstr "Italiano (Italiano)"
#: bookwyrm/settings.py:201
#: bookwyrm/settings.py:253
msgid "Français (French)"
msgstr "Français (Francês)"
#: bookwyrm/settings.py:202
#: bookwyrm/settings.py:254
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (lituano)"
#: bookwyrm/settings.py:203
#: bookwyrm/settings.py:255
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norueguês)"
#: bookwyrm/settings.py:204
#: bookwyrm/settings.py:256
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Português brasileiro)"
#: bookwyrm/settings.py:205
#: bookwyrm/settings.py:257
msgid "Português Europeu (European Portuguese)"
msgstr "Português (Português Europeu)"
#: bookwyrm/settings.py:206
#: bookwyrm/settings.py:258
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chinês simplificado)"
#: bookwyrm/settings.py:207
#: bookwyrm/settings.py:259
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinês tradicional)"
@ -351,9 +351,7 @@ msgstr "Conheça os nossos administradores"
#: bookwyrm/templates/about/about.html:98
#, python-format
msgid "\n"
" %(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior.\n"
" "
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior."
msgstr ""
#: bookwyrm/templates/about/about.html:112
@ -426,7 +424,7 @@ msgid "Copy address"
msgstr "Copiar endereço"
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:230
#: bookwyrm/templates/lists/list.html:231
msgid "Copied!"
msgstr "Copiado!"
@ -495,7 +493,7 @@ msgstr "A sua menor leitura este ano…"
#: bookwyrm/templates/annual_summary/layout.html:245
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "por"
@ -731,9 +729,9 @@ msgstr "Carregar os dados irá conectar a <strong>%(source_name)s</strong> e ver
#: bookwyrm/templates/author/sync_modal.html:22
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/book/sync_modal.html:22
#: bookwyrm/templates/groups/members.html:30
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
msgid "Confirm"
msgstr "Confirmar"
@ -817,8 +815,8 @@ msgid "Places"
msgstr "Lugares"
#: bookwyrm/templates/book/book.html:348
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:10
#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:11
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -832,7 +830,7 @@ msgstr "Adicionar à lista"
#: bookwyrm/templates/book/book.html:369
#: bookwyrm/templates/book/cover_add_modal.html:31
#: bookwyrm/templates/lists/list.html:208
#: bookwyrm/templates/lists/list.html:209
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
msgid "Add"
@ -934,7 +932,7 @@ msgid "Back"
msgstr "Voltar"
#: bookwyrm/templates/book/edit/edit_book_form.html:21
#: bookwyrm/templates/snippets/create_status/review.html:16
#: bookwyrm/templates/snippets/create_status/review.html:15
msgid "Title:"
msgstr "Título:"
@ -1649,7 +1647,7 @@ msgid "What are you reading?"
msgstr "O que andas a ler?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:162
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:163
msgid "Search for a book"
msgstr "Pesquisar por um livro"
@ -1667,9 +1665,9 @@ msgstr "Podes adicionar livros quando começas a usar %(site_name)s."
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/groups/members.html:17 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:166
#: bookwyrm/templates/groups/members.html:15
#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1685,7 +1683,7 @@ msgid "Popular on %(site_name)s"
msgstr "Populares em %(site_name)s"
#: bookwyrm/templates/get_started/books.html:58
#: bookwyrm/templates/lists/list.html:179
#: bookwyrm/templates/lists/list.html:180
msgid "No books found"
msgstr "Nenhum livro encontrado"
@ -1790,7 +1788,7 @@ msgstr "Esta ação não pode ser desfeita"
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
#: bookwyrm/templates/snippets/join_invitation_buttons.html:13
#: bookwyrm/templates/snippets/join_invitation_buttons.html:14
msgid "Delete"
msgstr "Apagar"
@ -1810,17 +1808,17 @@ msgstr "Descrição do Grupo:"
msgid "Delete group"
msgstr "Apagar grupo"
#: bookwyrm/templates/groups/group.html:22
#: bookwyrm/templates/groups/group.html:21
msgid "Members of this group can create group-curated lists."
msgstr "Os membros deste grupo podem criar listas administradas apenas pelo grupo."
#: bookwyrm/templates/groups/group.html:27
#: bookwyrm/templates/groups/group.html:26
#: bookwyrm/templates/lists/create_form.html:5
#: bookwyrm/templates/lists/lists.html:20
msgid "Create List"
msgstr "Criar Lista"
#: bookwyrm/templates/groups/group.html:40
#: bookwyrm/templates/groups/group.html:39
msgid "This group has no lists"
msgstr "Este grupo não tem listas"
@ -1828,15 +1826,15 @@ msgstr "Este grupo não tem listas"
msgid "Edit group"
msgstr "Editar grupo"
#: bookwyrm/templates/groups/members.html:12
#: bookwyrm/templates/groups/members.html:11
msgid "Search to add a user"
msgstr "Procura para adicionares um utilizador"
#: bookwyrm/templates/groups/members.html:33
#: bookwyrm/templates/groups/members.html:32
msgid "Leave group"
msgstr "Sair do grupo"
#: bookwyrm/templates/groups/members.html:55
#: bookwyrm/templates/groups/members.html:54
#: bookwyrm/templates/groups/suggested_users.html:35
#: bookwyrm/templates/snippets/suggested_users.html:31
#: bookwyrm/templates/user/user_preview.html:36
@ -2293,18 +2291,18 @@ msgstr "Apagar esta lista?"
msgid "Edit List"
msgstr "Editar lista"
#: bookwyrm/templates/lists/embed-list.html:7
#: bookwyrm/templates/lists/embed-list.html:8
#, python-format
msgid "%(list_name)s, a list by %(owner)s"
msgstr "%(list_name)s, uma lista de %(owner)s"
#: bookwyrm/templates/lists/embed-list.html:17
#: bookwyrm/templates/lists/embed-list.html:18
#, python-format
msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr "em <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:42
#: bookwyrm/templates/lists/embed-list.html:27
#: bookwyrm/templates/lists/list.html:43
msgid "This list is currently empty"
msgstr "Esta lista está vazia"
@ -2365,76 +2363,76 @@ msgstr "Criar um Grupo"
msgid "Delete list"
msgstr "Apagar lista"
#: bookwyrm/templates/lists/list.html:34
#: bookwyrm/templates/lists/list.html:35
msgid "You successfully suggested a book for this list!"
msgstr "Sugeriste um livro para esta lista com sucesso!"
#: bookwyrm/templates/lists/list.html:36
#: bookwyrm/templates/lists/list.html:37
msgid "You successfully added a book to this list!"
msgstr "Adicionaste um livro a esta lista com sucesso!"
#: bookwyrm/templates/lists/list.html:80
#: bookwyrm/templates/lists/list.html:81
#, python-format
msgid "Added by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "Adicionado por <a href=\"%(user_path)s\">%(username)s</a>"
#: bookwyrm/templates/lists/list.html:95
#: bookwyrm/templates/lists/list.html:96
msgid "List position"
msgstr "Posição da lista"
#: bookwyrm/templates/lists/list.html:101
#: bookwyrm/templates/lists/list.html:102
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
msgid "Set"
msgstr "Definir"
#: bookwyrm/templates/lists/list.html:116
#: bookwyrm/templates/snippets/remove_from_group_button.html:19
#: bookwyrm/templates/lists/list.html:117
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr "Remover"
#: bookwyrm/templates/lists/list.html:130
#: bookwyrm/templates/lists/list.html:147
#: bookwyrm/templates/lists/list.html:131
#: bookwyrm/templates/lists/list.html:148
msgid "Sort List"
msgstr "Ordenar lista"
#: bookwyrm/templates/lists/list.html:140
#: bookwyrm/templates/lists/list.html:141
msgid "Direction"
msgstr "Direcção"
#: bookwyrm/templates/lists/list.html:154
#: bookwyrm/templates/lists/list.html:155
msgid "Add Books"
msgstr "Adicionar Livros"
#: bookwyrm/templates/lists/list.html:156
#: bookwyrm/templates/lists/list.html:157
msgid "Suggest Books"
msgstr "Sugerir Livros"
#: bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/lists/list.html:168
msgid "search"
msgstr "pesquisar"
#: bookwyrm/templates/lists/list.html:173
#: bookwyrm/templates/lists/list.html:174
msgid "Clear search"
msgstr "Limpar Pesquisa"
#: bookwyrm/templates/lists/list.html:178
#: bookwyrm/templates/lists/list.html:179
#, python-format
msgid "No books found matching the query \"%(query)s\""
msgstr "Nenhum livro encontrado que corresponda à consulta \"%(query)s\""
#: bookwyrm/templates/lists/list.html:210
#: bookwyrm/templates/lists/list.html:211
msgid "Suggest"
msgstr "Sugerir"
#: bookwyrm/templates/lists/list.html:221
#: bookwyrm/templates/lists/list.html:222
msgid "Embed this list on a website"
msgstr "Incorporar esta lista num website"
#: bookwyrm/templates/lists/list.html:229
#: bookwyrm/templates/lists/list.html:230
msgid "Copy embed code"
msgstr "Copiar código de incorporação"
#: bookwyrm/templates/lists/list.html:231
#: bookwyrm/templates/lists/list.html:232
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr "%(list_name)s, uma lista de %(owner)s no %(site_name)s"
@ -3910,15 +3908,15 @@ msgstr "Concluído"
msgid "This shelf is empty."
msgstr "Esta prateleira está vazia."
#: bookwyrm/templates/snippets/add_to_group_button.html:15
#: bookwyrm/templates/snippets/add_to_group_button.html:16
msgid "Invite"
msgstr "Convidar"
#: bookwyrm/templates/snippets/add_to_group_button.html:24
#: bookwyrm/templates/snippets/add_to_group_button.html:25
msgid "Uninvite"
msgstr "Cancelar convite"
#: bookwyrm/templates/snippets/add_to_group_button.html:28
#: bookwyrm/templates/snippets/add_to_group_button.html:29
#, python-format
msgid "Remove @%(username)s"
msgstr "Remover %(username)s"
@ -4006,7 +4004,7 @@ msgstr "Alerta de spoiler!"
msgid "Include spoiler alert"
msgstr "Incluir aviso de spoiler"
#: bookwyrm/templates/snippets/create_status/layout.html:48
#: bookwyrm/templates/snippets/create_status/layout.html:47
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Comentar:"
@ -4015,33 +4013,33 @@ msgstr "Comentar:"
msgid "Post"
msgstr "Publicação"
#: bookwyrm/templates/snippets/create_status/quotation.html:17
#: bookwyrm/templates/snippets/create_status/quotation.html:16
msgid "Quote:"
msgstr "Citação:"
#: bookwyrm/templates/snippets/create_status/quotation.html:25
#: bookwyrm/templates/snippets/create_status/quotation.html:24
#, python-format
msgid "An excerpt from '%(book_title)s'"
msgstr "Um excerto de '%(book_title)s'"
#: bookwyrm/templates/snippets/create_status/quotation.html:32
#: bookwyrm/templates/snippets/create_status/quotation.html:31
msgid "Position:"
msgstr "Posição:"
#: bookwyrm/templates/snippets/create_status/quotation.html:45
#: bookwyrm/templates/snippets/create_status/quotation.html:44
msgid "On page:"
msgstr "Na página:"
#: bookwyrm/templates/snippets/create_status/quotation.html:51
#: bookwyrm/templates/snippets/create_status/quotation.html:50
msgid "At percent:"
msgstr "Na percentagem:"
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/snippets/create_status/review.html:24
#, python-format
msgid "Your review of '%(book_title)s'"
msgstr "A tua critica de '%(book_title)s'"
#: bookwyrm/templates/snippets/create_status/review.html:40
#: bookwyrm/templates/snippets/create_status/review.html:39
msgid "Review:"
msgstr "Critica:"
@ -4095,7 +4093,7 @@ msgid "Unfollow"
msgstr "Deixar de seguir"
#: bookwyrm/templates/snippets/follow_request_buttons.html:7
#: bookwyrm/templates/snippets/join_invitation_buttons.html:8
#: bookwyrm/templates/snippets/join_invitation_buttons.html:9
msgid "Accept"
msgstr "Aceitar"
@ -4135,14 +4133,14 @@ msgstr[1] "avaliado <em><a href=\"%(path)s\">%(title)s</a></em>: %(display_ratin
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s stars): %(review_title)s"
msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:12
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\": %(review_title)s"
msgid "Review of \"%(book_title)s\": %(review_title)s"
msgstr ""
#: bookwyrm/templates/snippets/goal_form.html:4
@ -4213,11 +4211,11 @@ msgstr "Apenas seguidores"
msgid "Post privacy"
msgstr "Privacidade de publicação"
#: bookwyrm/templates/snippets/rate_action.html:4
#: bookwyrm/templates/snippets/rate_action.html:5
msgid "Leave a rating"
msgstr "Deixar uma avaliação"
#: bookwyrm/templates/snippets/rate_action.html:19
#: bookwyrm/templates/snippets/rate_action.html:20
msgid "Rate"
msgstr "Avaliação"
@ -4311,29 +4309,29 @@ msgstr "Remover de %(name)s"
msgid "Finish reading"
msgstr "Terminar leitura"
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/status/content_status.html:73
msgid "Content warning"
msgstr "Aviso de Conteúdo"
#: bookwyrm/templates/snippets/status/content_status.html:79
#: bookwyrm/templates/snippets/status/content_status.html:80
msgid "Show status"
msgstr "Mostrar o estado"
#: bookwyrm/templates/snippets/status/content_status.html:101
#: bookwyrm/templates/snippets/status/content_status.html:102
#, python-format
msgid "(Page %(page)s)"
msgstr "(Página %(page)s)"
#: bookwyrm/templates/snippets/status/content_status.html:103
#: bookwyrm/templates/snippets/status/content_status.html:104
#, python-format
msgid "(%(percent)s%%)"
msgstr "(%(percent)s%%)"
#: bookwyrm/templates/snippets/status/content_status.html:125
#: bookwyrm/templates/snippets/status/content_status.html:126
msgid "Open image in new window"
msgstr "Abrir imagem numa nova janela"
#: bookwyrm/templates/snippets/status/content_status.html:144
#: bookwyrm/templates/snippets/status/content_status.html:145
msgid "Hide status"
msgstr "Ocultar estado"

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-17 19:26+0000\n"
"PO-Revision-Date: 2022-01-17 19:57\n"
"POT-Creation-Date: 2022-01-20 17:58+0000\n"
"PO-Revision-Date: 2022-01-20 22:34\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Chinese Simplified\n"
"Language: zh\n"
@ -56,11 +56,11 @@ msgstr "书名"
#: bookwyrm/forms.py:485 bookwyrm/templates/shelf/shelf.html:155
#: bookwyrm/templates/shelf/shelf.html:187
#: bookwyrm/templates/snippets/create_status/review.html:33
#: bookwyrm/templates/snippets/create_status/review.html:32
msgid "Rating"
msgstr "评价"
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:134
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:135
msgid "Sort By"
msgstr "排序方式"
@ -224,69 +224,69 @@ msgstr "引用"
msgid "Everything else"
msgstr "所有其它内容"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home Timeline"
msgstr "主页时间线"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home"
msgstr "主页"
#: bookwyrm/settings.py:122
#: bookwyrm/settings.py:174
msgid "Books Timeline"
msgstr "书目时间线"
#: bookwyrm/settings.py:122 bookwyrm/templates/search/layout.html:21
#: bookwyrm/settings.py:174 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "书目"
#: bookwyrm/settings.py:196
#: bookwyrm/settings.py:248
msgid "English"
msgstr "English英语"
#: bookwyrm/settings.py:197
#: bookwyrm/settings.py:249
msgid "Deutsch (German)"
msgstr "Deutsch德语"
#: bookwyrm/settings.py:198
#: bookwyrm/settings.py:250
msgid "Español (Spanish)"
msgstr "Español西班牙语"
#: bookwyrm/settings.py:199
#: bookwyrm/settings.py:251
msgid "Galego (Galician)"
msgstr "Galego加利西亚语"
#: bookwyrm/settings.py:200
#: bookwyrm/settings.py:252
msgid "Italiano (Italian)"
msgstr ""
#: bookwyrm/settings.py:201
#: bookwyrm/settings.py:253
msgid "Français (French)"
msgstr "Français法语"
#: bookwyrm/settings.py:202
#: bookwyrm/settings.py:254
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių立陶宛语"
#: bookwyrm/settings.py:203
#: bookwyrm/settings.py:255
msgid "Norsk (Norwegian)"
msgstr ""
#: bookwyrm/settings.py:204
#: bookwyrm/settings.py:256
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr ""
#: bookwyrm/settings.py:205
#: bookwyrm/settings.py:257
msgid "Português Europeu (European Portuguese)"
msgstr ""
#: bookwyrm/settings.py:206
#: bookwyrm/settings.py:258
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文"
#: bookwyrm/settings.py:207
#: bookwyrm/settings.py:259
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文(繁体中文)"
@ -351,9 +351,7 @@ msgstr ""
#: bookwyrm/templates/about/about.html:98
#, python-format
msgid "\n"
" %(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior.\n"
" "
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior."
msgstr ""
#: bookwyrm/templates/about/about.html:112
@ -426,7 +424,7 @@ msgid "Copy address"
msgstr "复制地址"
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:230
#: bookwyrm/templates/lists/list.html:231
msgid "Copied!"
msgstr "复制成功!"
@ -493,7 +491,7 @@ msgstr "TA 今年阅读最短的…"
#: bookwyrm/templates/annual_summary/layout.html:245
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "作者"
@ -727,9 +725,9 @@ msgstr "加载数据会连接到 <strong>%(source_name)s</strong> 并检查这
#: bookwyrm/templates/author/sync_modal.html:22
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/book/sync_modal.html:22
#: bookwyrm/templates/groups/members.html:30
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
msgid "Confirm"
msgstr "确认"
@ -812,8 +810,8 @@ msgid "Places"
msgstr "地点"
#: bookwyrm/templates/book/book.html:348
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:10
#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:11
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -827,7 +825,7 @@ msgstr "添加到列表"
#: bookwyrm/templates/book/book.html:369
#: bookwyrm/templates/book/cover_add_modal.html:31
#: bookwyrm/templates/lists/list.html:208
#: bookwyrm/templates/lists/list.html:209
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
msgid "Add"
@ -929,7 +927,7 @@ msgid "Back"
msgstr "返回"
#: bookwyrm/templates/book/edit/edit_book_form.html:21
#: bookwyrm/templates/snippets/create_status/review.html:16
#: bookwyrm/templates/snippets/create_status/review.html:15
msgid "Title:"
msgstr "标题:"
@ -1642,7 +1640,7 @@ msgid "What are you reading?"
msgstr "你在阅读什么?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:162
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:163
msgid "Search for a book"
msgstr "搜索书目"
@ -1660,9 +1658,9 @@ msgstr "你可以在开始使用 %(site_name)s 后添加书目。"
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/groups/members.html:17 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:166
#: bookwyrm/templates/groups/members.html:15
#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1678,7 +1676,7 @@ msgid "Popular on %(site_name)s"
msgstr "%(site_name)s 上的热门"
#: bookwyrm/templates/get_started/books.html:58
#: bookwyrm/templates/lists/list.html:179
#: bookwyrm/templates/lists/list.html:180
msgid "No books found"
msgstr "没有找到书目"
@ -1783,7 +1781,7 @@ msgstr "此操作无法被撤销"
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
#: bookwyrm/templates/snippets/join_invitation_buttons.html:13
#: bookwyrm/templates/snippets/join_invitation_buttons.html:14
msgid "Delete"
msgstr "删除"
@ -1803,17 +1801,17 @@ msgstr "群组描述"
msgid "Delete group"
msgstr "删除群组"
#: bookwyrm/templates/groups/group.html:22
#: bookwyrm/templates/groups/group.html:21
msgid "Members of this group can create group-curated lists."
msgstr ""
#: bookwyrm/templates/groups/group.html:27
#: bookwyrm/templates/groups/group.html:26
#: bookwyrm/templates/lists/create_form.html:5
#: bookwyrm/templates/lists/lists.html:20
msgid "Create List"
msgstr "创建列表"
#: bookwyrm/templates/groups/group.html:40
#: bookwyrm/templates/groups/group.html:39
msgid "This group has no lists"
msgstr "这个群组没有任何列表"
@ -1821,15 +1819,15 @@ msgstr "这个群组没有任何列表"
msgid "Edit group"
msgstr "编辑群组"
#: bookwyrm/templates/groups/members.html:12
#: bookwyrm/templates/groups/members.html:11
msgid "Search to add a user"
msgstr "搜索或添加用户"
#: bookwyrm/templates/groups/members.html:33
#: bookwyrm/templates/groups/members.html:32
msgid "Leave group"
msgstr "退出群组"
#: bookwyrm/templates/groups/members.html:55
#: bookwyrm/templates/groups/members.html:54
#: bookwyrm/templates/groups/suggested_users.html:35
#: bookwyrm/templates/snippets/suggested_users.html:31
#: bookwyrm/templates/user/user_preview.html:36
@ -2282,18 +2280,18 @@ msgstr "删除此列表?"
msgid "Edit List"
msgstr "编辑列表"
#: bookwyrm/templates/lists/embed-list.html:7
#: bookwyrm/templates/lists/embed-list.html:8
#, python-format
msgid "%(list_name)s, a list by %(owner)s"
msgstr "%(list_name)s来自 %(owner)s 的列表"
#: bookwyrm/templates/lists/embed-list.html:17
#: bookwyrm/templates/lists/embed-list.html:18
#, python-format
msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr "在 <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:42
#: bookwyrm/templates/lists/embed-list.html:27
#: bookwyrm/templates/lists/list.html:43
msgid "This list is currently empty"
msgstr "此列表当前是空的"
@ -2354,76 +2352,76 @@ msgstr "创建一个群组"
msgid "Delete list"
msgstr "删除列表"
#: bookwyrm/templates/lists/list.html:34
#: bookwyrm/templates/lists/list.html:35
msgid "You successfully suggested a book for this list!"
msgstr "你成功向该列表推荐了一本书!"
#: bookwyrm/templates/lists/list.html:36
#: bookwyrm/templates/lists/list.html:37
msgid "You successfully added a book to this list!"
msgstr "你成功向此列表添加了一本书!"
#: bookwyrm/templates/lists/list.html:80
#: bookwyrm/templates/lists/list.html:81
#, python-format
msgid "Added by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "由 <a href=\"%(user_path)s\">%(username)s</a> 添加"
#: bookwyrm/templates/lists/list.html:95
#: bookwyrm/templates/lists/list.html:96
msgid "List position"
msgstr "列表位置:"
#: bookwyrm/templates/lists/list.html:101
#: bookwyrm/templates/lists/list.html:102
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
msgid "Set"
msgstr "设定"
#: bookwyrm/templates/lists/list.html:116
#: bookwyrm/templates/snippets/remove_from_group_button.html:19
#: bookwyrm/templates/lists/list.html:117
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr "移除"
#: bookwyrm/templates/lists/list.html:130
#: bookwyrm/templates/lists/list.html:147
#: bookwyrm/templates/lists/list.html:131
#: bookwyrm/templates/lists/list.html:148
msgid "Sort List"
msgstr "排序列表"
#: bookwyrm/templates/lists/list.html:140
#: bookwyrm/templates/lists/list.html:141
msgid "Direction"
msgstr "方向"
#: bookwyrm/templates/lists/list.html:154
#: bookwyrm/templates/lists/list.html:155
msgid "Add Books"
msgstr "添加书目"
#: bookwyrm/templates/lists/list.html:156
#: bookwyrm/templates/lists/list.html:157
msgid "Suggest Books"
msgstr "推荐书目"
#: bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/lists/list.html:168
msgid "search"
msgstr "搜索"
#: bookwyrm/templates/lists/list.html:173
#: bookwyrm/templates/lists/list.html:174
msgid "Clear search"
msgstr "清除搜索"
#: bookwyrm/templates/lists/list.html:178
#: bookwyrm/templates/lists/list.html:179
#, python-format
msgid "No books found matching the query \"%(query)s\""
msgstr "没有符合 “%(query)s” 请求的书目"
#: bookwyrm/templates/lists/list.html:210
#: bookwyrm/templates/lists/list.html:211
msgid "Suggest"
msgstr "推荐"
#: bookwyrm/templates/lists/list.html:221
#: bookwyrm/templates/lists/list.html:222
msgid "Embed this list on a website"
msgstr "将此列表嵌入到网站"
#: bookwyrm/templates/lists/list.html:229
#: bookwyrm/templates/lists/list.html:230
msgid "Copy embed code"
msgstr "复制嵌入代码"
#: bookwyrm/templates/lists/list.html:231
#: bookwyrm/templates/lists/list.html:232
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr "%(list_name)s%(owner)s 在 %(site_name)s 上的列表"
@ -3894,15 +3892,15 @@ msgstr "完成时间"
msgid "This shelf is empty."
msgstr "此书架是空的。"
#: bookwyrm/templates/snippets/add_to_group_button.html:15
#: bookwyrm/templates/snippets/add_to_group_button.html:16
msgid "Invite"
msgstr "邀请"
#: bookwyrm/templates/snippets/add_to_group_button.html:24
#: bookwyrm/templates/snippets/add_to_group_button.html:25
msgid "Uninvite"
msgstr "移除邀请"
#: bookwyrm/templates/snippets/add_to_group_button.html:28
#: bookwyrm/templates/snippets/add_to_group_button.html:29
#, python-format
msgid "Remove @%(username)s"
msgstr "移除 @%(username)s"
@ -3989,7 +3987,7 @@ msgstr "前有剧透!"
msgid "Include spoiler alert"
msgstr "加入剧透警告"
#: bookwyrm/templates/snippets/create_status/layout.html:48
#: bookwyrm/templates/snippets/create_status/layout.html:47
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "评论:"
@ -3998,33 +3996,33 @@ msgstr "评论:"
msgid "Post"
msgstr "发布"
#: bookwyrm/templates/snippets/create_status/quotation.html:17
#: bookwyrm/templates/snippets/create_status/quotation.html:16
msgid "Quote:"
msgstr "引用:"
#: bookwyrm/templates/snippets/create_status/quotation.html:25
#: bookwyrm/templates/snippets/create_status/quotation.html:24
#, python-format
msgid "An excerpt from '%(book_title)s'"
msgstr "摘自《%(book_title)s》的节录"
#: bookwyrm/templates/snippets/create_status/quotation.html:32
#: bookwyrm/templates/snippets/create_status/quotation.html:31
msgid "Position:"
msgstr "位置:"
#: bookwyrm/templates/snippets/create_status/quotation.html:45
#: bookwyrm/templates/snippets/create_status/quotation.html:44
msgid "On page:"
msgstr "页码:"
#: bookwyrm/templates/snippets/create_status/quotation.html:51
#: bookwyrm/templates/snippets/create_status/quotation.html:50
msgid "At percent:"
msgstr "百分比:"
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/snippets/create_status/review.html:24
#, python-format
msgid "Your review of '%(book_title)s'"
msgstr "你对《%(book_title)s》的书评"
#: bookwyrm/templates/snippets/create_status/review.html:40
#: bookwyrm/templates/snippets/create_status/review.html:39
msgid "Review:"
msgstr "书评:"
@ -4078,7 +4076,7 @@ msgid "Unfollow"
msgstr "取消关注"
#: bookwyrm/templates/snippets/follow_request_buttons.html:7
#: bookwyrm/templates/snippets/join_invitation_buttons.html:8
#: bookwyrm/templates/snippets/join_invitation_buttons.html:9
msgid "Accept"
msgstr "接受"
@ -4114,13 +4112,13 @@ msgstr[0] "为 <em><a href=\"%(path)s\">%(title)s</a></em> 打了分: %(display_
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s stars): %(review_title)s"
msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] ""
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:12
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\": %(review_title)s"
msgid "Review of \"%(book_title)s\": %(review_title)s"
msgstr ""
#: bookwyrm/templates/snippets/goal_form.html:4
@ -4191,11 +4189,11 @@ msgstr "仅关注者"
msgid "Post privacy"
msgstr "发文隐私"
#: bookwyrm/templates/snippets/rate_action.html:4
#: bookwyrm/templates/snippets/rate_action.html:5
msgid "Leave a rating"
msgstr "留下评价"
#: bookwyrm/templates/snippets/rate_action.html:19
#: bookwyrm/templates/snippets/rate_action.html:20
msgid "Rate"
msgstr "评价"
@ -4289,29 +4287,29 @@ msgstr "从 %(name)s 移除"
msgid "Finish reading"
msgstr "完成阅读"
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/status/content_status.html:73
msgid "Content warning"
msgstr "内容警告"
#: bookwyrm/templates/snippets/status/content_status.html:79
#: bookwyrm/templates/snippets/status/content_status.html:80
msgid "Show status"
msgstr "显示状态"
#: bookwyrm/templates/snippets/status/content_status.html:101
#: bookwyrm/templates/snippets/status/content_status.html:102
#, python-format
msgid "(Page %(page)s)"
msgstr "(第 %(page)s 页)"
#: bookwyrm/templates/snippets/status/content_status.html:103
#: bookwyrm/templates/snippets/status/content_status.html:104
#, python-format
msgid "(%(percent)s%%)"
msgstr "%(percent)s%%"
#: bookwyrm/templates/snippets/status/content_status.html:125
#: bookwyrm/templates/snippets/status/content_status.html:126
msgid "Open image in new window"
msgstr "在新窗口中打开图像"
#: bookwyrm/templates/snippets/status/content_status.html:144
#: bookwyrm/templates/snippets/status/content_status.html:145
msgid "Hide status"
msgstr "隐藏状态"

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-01-17 19:26+0000\n"
"PO-Revision-Date: 2022-01-17 19:57\n"
"POT-Creation-Date: 2022-01-20 17:58+0000\n"
"PO-Revision-Date: 2022-01-20 22:34\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Chinese Traditional\n"
"Language: zh\n"
@ -56,11 +56,11 @@ msgstr "書名"
#: bookwyrm/forms.py:485 bookwyrm/templates/shelf/shelf.html:155
#: bookwyrm/templates/shelf/shelf.html:187
#: bookwyrm/templates/snippets/create_status/review.html:33
#: bookwyrm/templates/snippets/create_status/review.html:32
msgid "Rating"
msgstr "評價"
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:134
#: bookwyrm/forms.py:487 bookwyrm/templates/lists/list.html:135
msgid "Sort By"
msgstr "排序方式"
@ -224,69 +224,69 @@ msgstr ""
msgid "Everything else"
msgstr ""
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home Timeline"
msgstr "主頁時間線"
#: bookwyrm/settings.py:121
#: bookwyrm/settings.py:173
msgid "Home"
msgstr "主頁"
#: bookwyrm/settings.py:122
#: bookwyrm/settings.py:174
msgid "Books Timeline"
msgstr ""
#: bookwyrm/settings.py:122 bookwyrm/templates/search/layout.html:21
#: bookwyrm/settings.py:174 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "書目"
#: bookwyrm/settings.py:196
#: bookwyrm/settings.py:248
msgid "English"
msgstr "English英語"
#: bookwyrm/settings.py:197
#: bookwyrm/settings.py:249
msgid "Deutsch (German)"
msgstr "Deutsch德語"
#: bookwyrm/settings.py:198
#: bookwyrm/settings.py:250
msgid "Español (Spanish)"
msgstr "Español西班牙語"
#: bookwyrm/settings.py:199
#: bookwyrm/settings.py:251
msgid "Galego (Galician)"
msgstr ""
#: bookwyrm/settings.py:200
#: bookwyrm/settings.py:252
msgid "Italiano (Italian)"
msgstr ""
#: bookwyrm/settings.py:201
#: bookwyrm/settings.py:253
msgid "Français (French)"
msgstr "Français法語"
#: bookwyrm/settings.py:202
#: bookwyrm/settings.py:254
msgid "Lietuvių (Lithuanian)"
msgstr ""
#: bookwyrm/settings.py:203
#: bookwyrm/settings.py:255
msgid "Norsk (Norwegian)"
msgstr ""
#: bookwyrm/settings.py:204
#: bookwyrm/settings.py:256
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr ""
#: bookwyrm/settings.py:205
#: bookwyrm/settings.py:257
msgid "Português Europeu (European Portuguese)"
msgstr ""
#: bookwyrm/settings.py:206
#: bookwyrm/settings.py:258
msgid "简体中文 (Simplified Chinese)"
msgstr "簡體中文"
#: bookwyrm/settings.py:207
#: bookwyrm/settings.py:259
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文"
@ -351,9 +351,7 @@ msgstr ""
#: bookwyrm/templates/about/about.html:98
#, python-format
msgid "\n"
" %(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior.\n"
" "
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the <a href=\"coc_path\">code of conduct</a>, and respond when users report spam and bad behavior."
msgstr ""
#: bookwyrm/templates/about/about.html:112
@ -426,7 +424,7 @@ msgid "Copy address"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:230
#: bookwyrm/templates/lists/list.html:231
msgid "Copied!"
msgstr ""
@ -493,7 +491,7 @@ msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:245
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "作者"
@ -727,9 +725,9 @@ msgstr ""
#: bookwyrm/templates/author/sync_modal.html:22
#: bookwyrm/templates/book/edit/edit_book.html:108
#: bookwyrm/templates/book/sync_modal.html:22
#: bookwyrm/templates/groups/members.html:30
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:16
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
msgid "Confirm"
msgstr "確認"
@ -812,8 +810,8 @@ msgid "Places"
msgstr "地點"
#: bookwyrm/templates/book/book.html:348
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:10
#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/curate.html:7 bookwyrm/templates/lists/list.html:11
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -827,7 +825,7 @@ msgstr "新增到列表"
#: bookwyrm/templates/book/book.html:369
#: bookwyrm/templates/book/cover_add_modal.html:31
#: bookwyrm/templates/lists/list.html:208
#: bookwyrm/templates/lists/list.html:209
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
msgid "Add"
@ -929,7 +927,7 @@ msgid "Back"
msgstr "返回"
#: bookwyrm/templates/book/edit/edit_book_form.html:21
#: bookwyrm/templates/snippets/create_status/review.html:16
#: bookwyrm/templates/snippets/create_status/review.html:15
msgid "Title:"
msgstr "標題:"
@ -1642,7 +1640,7 @@ msgid "What are you reading?"
msgstr "你在閱讀什麼?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:162
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:163
msgid "Search for a book"
msgstr "搜尋書目"
@ -1660,9 +1658,9 @@ msgstr "你可以在開始使用 %(site_name)s 後新增書目。"
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:16
#: bookwyrm/templates/groups/members.html:17 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:166
#: bookwyrm/templates/groups/members.html:15
#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1678,7 +1676,7 @@ msgid "Popular on %(site_name)s"
msgstr "%(site_name)s 上的熱門"
#: bookwyrm/templates/get_started/books.html:58
#: bookwyrm/templates/lists/list.html:179
#: bookwyrm/templates/lists/list.html:180
msgid "No books found"
msgstr "沒有找到書目"
@ -1783,7 +1781,7 @@ msgstr ""
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
#: bookwyrm/templates/snippets/join_invitation_buttons.html:13
#: bookwyrm/templates/snippets/join_invitation_buttons.html:14
msgid "Delete"
msgstr "刪除"
@ -1803,17 +1801,17 @@ msgstr ""
msgid "Delete group"
msgstr ""
#: bookwyrm/templates/groups/group.html:22
#: bookwyrm/templates/groups/group.html:21
msgid "Members of this group can create group-curated lists."
msgstr ""
#: bookwyrm/templates/groups/group.html:27
#: bookwyrm/templates/groups/group.html:26
#: bookwyrm/templates/lists/create_form.html:5
#: bookwyrm/templates/lists/lists.html:20
msgid "Create List"
msgstr "建立列表"
#: bookwyrm/templates/groups/group.html:40
#: bookwyrm/templates/groups/group.html:39
msgid "This group has no lists"
msgstr ""
@ -1821,15 +1819,15 @@ msgstr ""
msgid "Edit group"
msgstr ""
#: bookwyrm/templates/groups/members.html:12
#: bookwyrm/templates/groups/members.html:11
msgid "Search to add a user"
msgstr ""
#: bookwyrm/templates/groups/members.html:33
#: bookwyrm/templates/groups/members.html:32
msgid "Leave group"
msgstr ""
#: bookwyrm/templates/groups/members.html:55
#: bookwyrm/templates/groups/members.html:54
#: bookwyrm/templates/groups/suggested_users.html:35
#: bookwyrm/templates/snippets/suggested_users.html:31
#: bookwyrm/templates/user/user_preview.html:36
@ -2282,18 +2280,18 @@ msgstr ""
msgid "Edit List"
msgstr "編輯列表"
#: bookwyrm/templates/lists/embed-list.html:7
#: bookwyrm/templates/lists/embed-list.html:8
#, python-format
msgid "%(list_name)s, a list by %(owner)s"
msgstr ""
#: bookwyrm/templates/lists/embed-list.html:17
#: bookwyrm/templates/lists/embed-list.html:18
#, python-format
msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr ""
#: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:42
#: bookwyrm/templates/lists/embed-list.html:27
#: bookwyrm/templates/lists/list.html:43
msgid "This list is currently empty"
msgstr "此列表當前是空的"
@ -2354,76 +2352,76 @@ msgstr ""
msgid "Delete list"
msgstr ""
#: bookwyrm/templates/lists/list.html:34
#: bookwyrm/templates/lists/list.html:35
msgid "You successfully suggested a book for this list!"
msgstr "你成功!向該列表推薦了一本書"
#: bookwyrm/templates/lists/list.html:36
#: bookwyrm/templates/lists/list.html:37
msgid "You successfully added a book to this list!"
msgstr "你成功在此列表新增了一本書!"
#: bookwyrm/templates/lists/list.html:80
#: bookwyrm/templates/lists/list.html:81
#, python-format
msgid "Added by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "由 <a href=\"%(user_path)s\">%(username)s</a> 新增"
#: bookwyrm/templates/lists/list.html:95
#: bookwyrm/templates/lists/list.html:96
msgid "List position"
msgstr "列表位置:"
#: bookwyrm/templates/lists/list.html:101
#: bookwyrm/templates/lists/list.html:102
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
msgid "Set"
msgstr "設定"
#: bookwyrm/templates/lists/list.html:116
#: bookwyrm/templates/snippets/remove_from_group_button.html:19
#: bookwyrm/templates/lists/list.html:117
#: bookwyrm/templates/snippets/remove_from_group_button.html:20
msgid "Remove"
msgstr "移除"
#: bookwyrm/templates/lists/list.html:130
#: bookwyrm/templates/lists/list.html:147
#: bookwyrm/templates/lists/list.html:131
#: bookwyrm/templates/lists/list.html:148
msgid "Sort List"
msgstr "排序列表"
#: bookwyrm/templates/lists/list.html:140
#: bookwyrm/templates/lists/list.html:141
msgid "Direction"
msgstr "方向"
#: bookwyrm/templates/lists/list.html:154
#: bookwyrm/templates/lists/list.html:155
msgid "Add Books"
msgstr "新增書目"
#: bookwyrm/templates/lists/list.html:156
#: bookwyrm/templates/lists/list.html:157
msgid "Suggest Books"
msgstr "推薦書目"
#: bookwyrm/templates/lists/list.html:167
#: bookwyrm/templates/lists/list.html:168
msgid "search"
msgstr "搜尋"
#: bookwyrm/templates/lists/list.html:173
#: bookwyrm/templates/lists/list.html:174
msgid "Clear search"
msgstr "清除搜尋"
#: bookwyrm/templates/lists/list.html:178
#: bookwyrm/templates/lists/list.html:179
#, python-format
msgid "No books found matching the query \"%(query)s\""
msgstr "沒有符合 \"%(query)s\" 請求的書目"
#: bookwyrm/templates/lists/list.html:210
#: bookwyrm/templates/lists/list.html:211
msgid "Suggest"
msgstr "推薦"
#: bookwyrm/templates/lists/list.html:221
#: bookwyrm/templates/lists/list.html:222
msgid "Embed this list on a website"
msgstr ""
#: bookwyrm/templates/lists/list.html:229
#: bookwyrm/templates/lists/list.html:230
msgid "Copy embed code"
msgstr ""
#: bookwyrm/templates/lists/list.html:231
#: bookwyrm/templates/lists/list.html:232
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr ""
@ -3894,15 +3892,15 @@ msgstr "完成時間"
msgid "This shelf is empty."
msgstr "此書架是空的。"
#: bookwyrm/templates/snippets/add_to_group_button.html:15
#: bookwyrm/templates/snippets/add_to_group_button.html:16
msgid "Invite"
msgstr ""
#: bookwyrm/templates/snippets/add_to_group_button.html:24
#: bookwyrm/templates/snippets/add_to_group_button.html:25
msgid "Uninvite"
msgstr ""
#: bookwyrm/templates/snippets/add_to_group_button.html:28
#: bookwyrm/templates/snippets/add_to_group_button.html:29
#, python-format
msgid "Remove @%(username)s"
msgstr ""
@ -3989,7 +3987,7 @@ msgstr "前有劇透!"
msgid "Include spoiler alert"
msgstr "加入劇透警告"
#: bookwyrm/templates/snippets/create_status/layout.html:48
#: bookwyrm/templates/snippets/create_status/layout.html:47
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "評論:"
@ -3998,33 +3996,33 @@ msgstr "評論:"
msgid "Post"
msgstr "釋出"
#: bookwyrm/templates/snippets/create_status/quotation.html:17
#: bookwyrm/templates/snippets/create_status/quotation.html:16
msgid "Quote:"
msgstr "引用:"
#: bookwyrm/templates/snippets/create_status/quotation.html:25
#: bookwyrm/templates/snippets/create_status/quotation.html:24
#, python-format
msgid "An excerpt from '%(book_title)s'"
msgstr ""
#: bookwyrm/templates/snippets/create_status/quotation.html:32
#: bookwyrm/templates/snippets/create_status/quotation.html:31
msgid "Position:"
msgstr ""
#: bookwyrm/templates/snippets/create_status/quotation.html:45
#: bookwyrm/templates/snippets/create_status/quotation.html:44
msgid "On page:"
msgstr ""
#: bookwyrm/templates/snippets/create_status/quotation.html:51
#: bookwyrm/templates/snippets/create_status/quotation.html:50
msgid "At percent:"
msgstr ""
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/snippets/create_status/review.html:24
#, python-format
msgid "Your review of '%(book_title)s'"
msgstr ""
#: bookwyrm/templates/snippets/create_status/review.html:40
#: bookwyrm/templates/snippets/create_status/review.html:39
msgid "Review:"
msgstr "書評:"
@ -4078,7 +4076,7 @@ msgid "Unfollow"
msgstr "取消關注"
#: bookwyrm/templates/snippets/follow_request_buttons.html:7
#: bookwyrm/templates/snippets/join_invitation_buttons.html:8
#: bookwyrm/templates/snippets/join_invitation_buttons.html:9
msgid "Accept"
msgstr "接受"
@ -4114,13 +4112,13 @@ msgstr[0] ""
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\" (%(display_rating)s stars): %(review_title)s"
msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s"
msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s"
msgstr[0] ""
#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:12
#, python-format
msgid "Review of \"<a href='%(book_path)s'>%(book_title)s</a>\": %(review_title)s"
msgid "Review of \"%(book_title)s\": %(review_title)s"
msgstr ""
#: bookwyrm/templates/snippets/goal_form.html:4
@ -4191,11 +4189,11 @@ msgstr "僅關注者"
msgid "Post privacy"
msgstr "發文隱私"
#: bookwyrm/templates/snippets/rate_action.html:4
#: bookwyrm/templates/snippets/rate_action.html:5
msgid "Leave a rating"
msgstr "留下評價"
#: bookwyrm/templates/snippets/rate_action.html:19
#: bookwyrm/templates/snippets/rate_action.html:20
msgid "Rate"
msgstr "評價"
@ -4289,29 +4287,29 @@ msgstr "從 %(name)s 移除"
msgid "Finish reading"
msgstr "完成閱讀"
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/status/content_status.html:73
msgid "Content warning"
msgstr ""
#: bookwyrm/templates/snippets/status/content_status.html:79
#: bookwyrm/templates/snippets/status/content_status.html:80
msgid "Show status"
msgstr ""
#: bookwyrm/templates/snippets/status/content_status.html:101
#: bookwyrm/templates/snippets/status/content_status.html:102
#, python-format
msgid "(Page %(page)s)"
msgstr ""
#: bookwyrm/templates/snippets/status/content_status.html:103
#: bookwyrm/templates/snippets/status/content_status.html:104
#, python-format
msgid "(%(percent)s%%)"
msgstr ""
#: bookwyrm/templates/snippets/status/content_status.html:125
#: bookwyrm/templates/snippets/status/content_status.html:126
msgid "Open image in new window"
msgstr "在新視窗中開啟圖片"
#: bookwyrm/templates/snippets/status/content_status.html:144
#: bookwyrm/templates/snippets/status/content_status.html:145
msgid "Hide status"
msgstr ""