Merge branch 'main' into list-not-loading

This commit is contained in:
Mouse Reeve 2021-12-30 10:44:23 -08:00
commit 975ef7d38e
96 changed files with 5890 additions and 3044 deletions
.env.dev.example.env.prod.example
.github/workflows
bookwyrm
bw-devcomplete_bwdev.sh
locale
de_DE/LC_MESSAGES
en_US/LC_MESSAGES
es_ES/LC_MESSAGES
fr_FR/LC_MESSAGES
gl_ES/LC_MESSAGES
lt_LT/LC_MESSAGES
pt_BR/LC_MESSAGES
zh_Hans/LC_MESSAGES
zh_Hant/LC_MESSAGES
package.jsonrequirements.txtyarn.lock

View file

@ -69,7 +69,7 @@ AWS_SECRET_ACCESS_KEY=
# or use_dominant_color_light / use_dominant_color_dark
PREVIEW_BG_COLOR=use_dominant_color_light
# Change to #FFF if you use use_dominant_color_dark
PREVIEW_TEXT_COLOR="#363636"
PREVIEW_TEXT_COLOR=#363636
PREVIEW_IMG_WIDTH=1200
PREVIEW_IMG_HEIGHT=630
PREVIEW_DEFAULT_COVER_COLOR="#002549"
PREVIEW_DEFAULT_COVER_COLOR=#002549

View file

@ -69,7 +69,7 @@ AWS_SECRET_ACCESS_KEY=
# or use_dominant_color_light / use_dominant_color_dark
PREVIEW_BG_COLOR=use_dominant_color_light
# Change to #FFF if you use use_dominant_color_dark
PREVIEW_TEXT_COLOR="#363636"
PREVIEW_TEXT_COLOR=#363636
PREVIEW_IMG_WIDTH=1200
PREVIEW_IMG_HEIGHT=630
PREVIEW_DEFAULT_COVER_COLOR="#002549"
PREVIEW_DEFAULT_COVER_COLOR=#002549

24
.github/workflows/prettier.yaml vendored Normal file
View file

@ -0,0 +1,24 @@
# @url https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions
name: JavaScript Prettier (run ./bw-dev prettier to fix)
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
lint:
name: Lint with Prettier
runs-on: ubuntu-20.04
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it.
- uses: actions/checkout@v2
- name: Install modules
run: npm install .
# See .stylelintignore for files that are not linted.
- name: Run Prettier
run: npx prettier --check bookwyrm/static/js/*.js

View file

@ -14,7 +14,8 @@ class LibrarythingImporter(Importer):
"""use the dataclass to create the formatted row of data"""
remove_brackets = lambda v: re.sub(r"\[|\]", "", v) if v else None
normalized = {k: remove_brackets(entry.get(v)) for k, v in mappings.items()}
isbn_13 = normalized["isbn_13"].split(", ")
isbn_13 = normalized.get("isbn_13")
isbn_13 = isbn_13.split(", ") if isbn_13 else []
normalized["isbn_13"] = isbn_13[1] if len(isbn_13) > 0 else None
return normalized

View file

@ -0,0 +1,18 @@
# Generated by Django 3.2.5 on 2021-12-22 11:06
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0120_list_embed_key"),
]
operations = [
migrations.AddField(
model_name="user",
name="summary_keys",
field=models.JSONField(null=True),
),
]

View file

@ -84,6 +84,7 @@ class BookWyrmModel(models.Model):
# you can see groups of which you are a member
if (
hasattr(self, "memberships")
and viewer.is_authenticated
and self.memberships.filter(user=viewer).exists()
):
return

View file

@ -148,6 +148,8 @@ class User(OrderedCollectionPageMixin, AbstractUser):
size=8,
default=get_feed_filter_choices,
)
# annual summary keys
summary_keys = models.JSONField(null=True)
preferred_timezone = models.CharField(
choices=[(str(tz), str(tz)) for tz in pytz.all_timezones],

View file

@ -14,7 +14,7 @@ VERSION = "0.1.0"
PAGE_LENGTH = env("PAGE_LENGTH", 15)
DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English")
JS_CACHE = "3891b373"
JS_CACHE = "2d3181e1"
# email
EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend")
@ -125,9 +125,9 @@ STREAMS = [
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
"NAME": env("POSTGRES_DB", "fedireads"),
"USER": env("POSTGRES_USER", "fedireads"),
"PASSWORD": env("POSTGRES_PASSWORD", "fedireads"),
"NAME": env("POSTGRES_DB", "bookwyrm"),
"USER": env("POSTGRES_USER", "bookwyrm"),
"PASSWORD": env("POSTGRES_PASSWORD", "bookwyrm"),
"HOST": env("POSTGRES_HOST", ""),
"PORT": env("PGPORT", 5432),
},

View file

@ -8,6 +8,44 @@ body {
flex-direction: column;
}
button {
border: none;
margin: 0;
padding: 0;
width: auto;
overflow: visible;
background: transparent;
/* inherit font, color & alignment from ancestor */
color: inherit;
font: inherit;
text-align: inherit;
/* Normalize `line-height`. Cannot be changed from `normal` in Firefox 4+. */
line-height: normal;
/* Corrects font smoothing for webkit */
-webkit-font-smoothing: inherit;
-moz-osx-font-smoothing: inherit;
/* Corrects inability to style clickable `input` types in iOS */
-webkit-appearance: none;
/* Generalizes pointer cursor */
cursor: pointer;
}
button::-moz-focus-inner {
/* Remove excess padding and border in Firefox 4+ */
border: 0;
padding: 0;
}
/* Better accessibility for keyboard users */
*:focus-visible {
outline-style: auto !important;
}
.image {
overflow: hidden;
}
@ -29,10 +67,38 @@ body {
overflow-x: auto;
}
.modal-card {
pointer-events: none;
}
.modal-card > * {
pointer-events: all;
}
/* stylelint-disable no-descending-specificity */
.modal-card:focus {
outline-style: auto;
}
.modal-card:focus:not(:focus-visible) {
outline-style: initial;
}
.modal-card:focus-visible {
outline-style: auto;
}
/* stylelint-enable no-descending-specificity */
.modal-card.is-fullwidth {
min-width: 75% !important;
}
@media only screen and (min-width: 769px) {
.modal-card.is-thin {
width: 350px !important;
}
}
.modal-card-body {
max-height: 70vh;
}
@ -93,6 +159,33 @@ body {
display: inline !important;
}
button .button-invisible-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
padding: 1rem;
box-sizing: border-box;
display: flex;
align-items: center;
flex-direction: column;
justify-content: center;
background: rgba(0, 0, 0, 0.66);
color: white;
opacity: 0;
transition: opacity 0.2s ease;
}
button:hover .button-invisible-overlay,
button:active .button-invisible-overlay,
button:focus-visible .button-invisible-overlay {
opacity: 1;
}
/** File input styles
******************************************************************************/
input[type=file]::file-selector-button {
-moz-appearance: none;
-webkit-appearance: none;
@ -119,17 +212,15 @@ input[type=file]::file-selector-button:hover {
color: #363636;
}
details .dropdown-menu {
display: block !important;
/** General `details` element styles
******************************************************************************/
summary {
cursor: pointer;
}
details.dropdown[open] summary.dropdown-trigger::before {
content: "";
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
summary::-webkit-details-marker {
display: none;
}
summary::marker {
@ -147,6 +238,57 @@ summary::marker {
margin-top: 1em;
}
/** Details dropdown
******************************************************************************/
details.dropdown[open] summary.dropdown-trigger::before {
content: "";
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
details .dropdown-menu {
display: block !important;
}
details .dropdown-menu button {
/* Fix weird Safari defaults */
box-sizing: border-box;
}
details.dropdown .dropdown-menu button:focus-visible,
details.dropdown .dropdown-menu a:focus-visible {
outline-style: auto;
outline-offset: -2px;
}
@media only screen and (max-width: 768px) {
details.dropdown[open] summary.dropdown-trigger::before {
background-color: rgba(0, 0, 0, 0.5);
z-index: 30;
}
details .dropdown-menu {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex !important;
align-items: center;
justify-content: center;
pointer-events: none;
z-index: 100;
}
details .dropdown-menu > * {
pointer-events: all;
}
}
/** Shelving
******************************************************************************/
@ -322,6 +464,8 @@ summary::marker {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 1em;
white-space: initial;
text-align: center;
}
@ -555,6 +699,74 @@ ol.ordered-list li::before {
padding: 0 0.75em;
}
/* Breadcrumbs
******************************************************************************/
.books-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
align-items: end;
justify-items: stretch;
}
.books-grid > .is-big {
grid-column: span 2;
grid-row: span 2;
justify-self: stretch;
}
.books-grid .book-cover {
width: 100%;
}
.books-grid .book-title {
--height-basis: 1.35rem;
display: block;
margin-top: 0.5rem;
line-height: var(--height-basis);
min-height: calc(2 * var(--height-basis));
}
@media only screen and (min-width: 769px) {
.books-grid {
gap: 1.5rem;
grid-template-columns: repeat(auto-fill, minmax(8em, 1fr));
}
}
/* Copy
******************************************************************************/
.horizontal-copy {
display: flex;
flex-direction: row;
align-items: center;
gap: 0.75rem;
}
.horizontal-copy textarea {
min-width: initial;
white-space: nowrap;
}
.horizontal-copy button {
align-self: stretch;
height: unset;
}
.vertical-copy {
display: flex;
flex-direction: column;
align-items: stretch;
gap: 0.75rem;
}
.vertical-copy button {
width: 100%;
}
/* Dimensions
* @todo These could be in rem.
******************************************************************************/

View file

@ -0,0 +1,95 @@
Copyright 2014-2018 Adobe (http://www.adobe.com/), with Reserved Font Name
'Source'. All Rights Reserved. Source is a trademark of Adobe in the United
States and/or other countries. Copyright 2019 Google LLC.
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View file

@ -0,0 +1,30 @@
# Font Squirrel Font-face Generator Configuration File
# Upload this file to the generator to recreate the settings
# you used to create these fonts.
{
"mode": "optimal",
"formats":
[
"woff",
"woff2"
],
"tt_instructor": "default",
"fix_gasp": "xy",
"fix_vertical_metrics": "Y",
"metrics_ascent": "",
"metrics_descent": "",
"metrics_linegap": "",
"add_spaces": "Y",
"add_hyphens": "Y",
"fallback": "none",
"fallback_custom": "100",
"options_subset": "basic",
"subset_custom": "",
"subset_custom_range": "",
"subset_ot_features_list": "",
"css_stylesheet": "stylesheet.css",
"filename_suffix": "-webfont",
"emsquare": "2048",
"spacing_adjustment": "0"
}

View file

@ -0,0 +1,19 @@
@font-face {
font-family: 'dm_serif_display';
src: url('../fonts/dm_serif_display/dmserifdisplay-italic-webfont.woff2') format('woff2'),
url('../fonts/dm_serif_display/dmserifdisplay-italic-webfont.woff') format('woff');
font-weight: normal;
font-style: italic;
}
@font-face {
font-family: 'dm_serif_display';
src: url('../fonts/dm_serif_display/dmserifdisplay-regular-webfont.woff2') format('woff2'),
url('../fonts/dm_serif_display/dmserifdisplay-regular-webfont.woff') format('woff');
font-weight: normal;
font-style: normal;
}
.is-serif {
font-family: 'dm_serif_display', Georgia, serif;
}

View file

@ -1,9 +1,10 @@
/* exported BlockHref */
let BlockHref = new class {
let BlockHref = new (class {
constructor() {
document.querySelectorAll('[data-href]')
.forEach(t => t.addEventListener('click', this.followLink.bind(this)));
document
.querySelectorAll("[data-href]")
.forEach((t) => t.addEventListener("click", this.followLink.bind(this)));
}
/**
@ -17,5 +18,4 @@ let BlockHref = new class {
window.location.href = url;
}
}();
})();

View file

@ -1,7 +1,7 @@
/* exported BookWyrm */
/* globals TabGroup */
let BookWyrm = new class {
let BookWyrm = new (class {
constructor() {
this.MAX_FILE_SIZE_BYTES = 10 * 1000000;
this.initOnDOMLoaded();
@ -10,48 +10,42 @@ let BookWyrm = new class {
}
initEventListeners() {
document.querySelectorAll('[data-controls]')
.forEach(button => button.addEventListener(
'click',
this.toggleAction.bind(this))
document
.querySelectorAll("[data-controls]")
.forEach((button) => button.addEventListener("click", this.toggleAction.bind(this)));
document
.querySelectorAll(".interaction")
.forEach((button) => button.addEventListener("submit", this.interact.bind(this)));
document
.querySelectorAll(".hidden-form input")
.forEach((button) => button.addEventListener("change", this.revealForm.bind(this)));
document
.querySelectorAll("[data-hides]")
.forEach((button) => button.addEventListener("change", this.hideForm.bind(this)));
document
.querySelectorAll("[data-back]")
.forEach((button) => button.addEventListener("click", this.back));
document
.querySelectorAll('input[type="file"]')
.forEach((node) => node.addEventListener("change", this.disableIfTooLarge.bind(this)));
document
.querySelectorAll("button[data-modal-open]")
.forEach((node) => node.addEventListener("click", this.handleModalButton.bind(this)));
document
.querySelectorAll("[data-duplicate]")
.forEach((node) => node.addEventListener("click", this.duplicateInput.bind(this)));
document
.querySelectorAll("details.dropdown")
.forEach((node) =>
node.addEventListener("toggle", this.handleDetailsDropdown.bind(this))
);
document.querySelectorAll('.interaction')
.forEach(button => button.addEventListener(
'submit',
this.interact.bind(this))
);
document.querySelectorAll('.hidden-form input')
.forEach(button => button.addEventListener(
'change',
this.revealForm.bind(this))
);
document.querySelectorAll('[data-hides]')
.forEach(button => button.addEventListener(
'change',
this.hideForm.bind(this))
);
document.querySelectorAll('[data-back]')
.forEach(button => button.addEventListener(
'click',
this.back)
);
document.querySelectorAll('input[type="file"]')
.forEach(node => node.addEventListener(
'change',
this.disableIfTooLarge.bind(this)
));
document.querySelectorAll('[data-duplicate]')
.forEach(node => node.addEventListener(
'click',
this.duplicateInput.bind(this)
))
}
/**
@ -60,15 +54,12 @@ let BookWyrm = new class {
initOnDOMLoaded() {
const bookwyrm = this;
window.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('.tab-group')
.forEach(tabs => new TabGroup(tabs));
document.querySelectorAll('input[type="file"]').forEach(
bookwyrm.disableIfTooLarge.bind(bookwyrm)
);
document.querySelectorAll('[data-copytext]').forEach(
bookwyrm.copyText.bind(bookwyrm)
);
window.addEventListener("DOMContentLoaded", function () {
document.querySelectorAll(".tab-group").forEach((tabs) => new TabGroup(tabs));
document
.querySelectorAll('input[type="file"]')
.forEach(bookwyrm.disableIfTooLarge.bind(bookwyrm));
document.querySelectorAll("[data-copytext]").forEach(bookwyrm.copyText.bind(bookwyrm));
});
}
@ -77,8 +68,7 @@ let BookWyrm = new class {
*/
initReccuringTasks() {
// Polling
document.querySelectorAll('[data-poll]')
.forEach(liveArea => this.polling(liveArea));
document.querySelectorAll("[data-poll]").forEach((liveArea) => this.polling(liveArea));
}
/**
@ -104,15 +94,19 @@ let BookWyrm = new class {
const bookwyrm = this;
delay = delay || 10000;
delay += (Math.random() * 1000);
delay += Math.random() * 1000;
setTimeout(function() {
fetch('/api/updates/' + counter.dataset.poll)
.then(response => response.json())
.then(data => bookwyrm.updateCountElement(counter, data));
setTimeout(
function () {
fetch("/api/updates/" + counter.dataset.poll)
.then((response) => response.json())
.then((data) => bookwyrm.updateCountElement(counter, data));
bookwyrm.polling(counter, delay * 1.25);
}, delay, counter);
bookwyrm.polling(counter, delay * 1.25);
},
delay,
counter
);
}
/**
@ -127,45 +121,41 @@ let BookWyrm = new class {
const count_by_type = data.count_by_type;
const currentCount = counter.innerText;
const hasMentions = data.has_mentions;
const allowedStatusTypesEl = document.getElementById('unread-notifications-wrapper');
const allowedStatusTypesEl = document.getElementById("unread-notifications-wrapper");
// If we're on the right counter element
if (counter.closest('[data-poll-wrapper]').contains(allowedStatusTypesEl)) {
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) {
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')) {
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}
);
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
count = Object.keys(count_by_everything_else).reduce(function (prev, currentKey) {
const currentValue = count_by_everything_else[currentKey] | 0;
return prev + currentValue;
},
count
);
return prev + currentValue;
}, count);
}
}
if (count != currentCount) {
this.addRemoveClass(counter.closest('[data-poll-wrapper]'), 'is-hidden', count < 1);
this.addRemoveClass(counter.closest("[data-poll-wrapper]"), "is-hidden", count < 1);
counter.innerText = count;
this.addRemoveClass(counter.closest('[data-poll-wrapper]'), 'is-danger', hasMentions);
this.addRemoveClass(counter.closest("[data-poll-wrapper]"), "is-danger", hasMentions);
}
}
@ -177,10 +167,10 @@ let BookWyrm = new class {
*/
revealForm(event) {
let trigger = event.currentTarget;
let hidden = trigger.closest('.hidden-form').querySelectorAll('.is-hidden')[0];
let hidden = trigger.closest(".hidden-form").querySelectorAll(".is-hidden")[0];
if (hidden) {
this.addRemoveClass(hidden, 'is-hidden', !hidden);
this.addRemoveClass(hidden, "is-hidden", !hidden);
}
}
@ -192,10 +182,10 @@ let BookWyrm = new class {
*/
hideForm(event) {
let trigger = event.currentTarget;
let targetId = trigger.dataset.hides
let visible = document.getElementById(targetId)
let targetId = trigger.dataset.hides;
let visible = document.getElementById(targetId);
this.addRemoveClass(visible, 'is-hidden', true);
this.addRemoveClass(visible, "is-hidden", true);
}
/**
@ -210,31 +200,34 @@ let BookWyrm = new class {
if (!trigger.dataset.allowDefault || event.currentTarget == event.target) {
event.preventDefault();
}
let pressed = trigger.getAttribute('aria-pressed') === 'false';
let pressed = trigger.getAttribute("aria-pressed") === "false";
let targetId = trigger.dataset.controls;
// Toggle pressed status on all triggers controlling the same target.
document.querySelectorAll('[data-controls="' + targetId + '"]')
.forEach(otherTrigger => otherTrigger.setAttribute(
'aria-pressed',
otherTrigger.getAttribute('aria-pressed') === 'false'
));
document
.querySelectorAll('[data-controls="' + targetId + '"]')
.forEach((otherTrigger) =>
otherTrigger.setAttribute(
"aria-pressed",
otherTrigger.getAttribute("aria-pressed") === "false"
)
);
// @todo Find a better way to handle the exception.
if (targetId && ! trigger.classList.contains('pulldown-menu')) {
if (targetId && !trigger.classList.contains("pulldown-menu")) {
let target = document.getElementById(targetId);
this.addRemoveClass(target, 'is-hidden', !pressed);
this.addRemoveClass(target, 'is-active', pressed);
this.addRemoveClass(target, "is-hidden", !pressed);
this.addRemoveClass(target, "is-active", pressed);
}
// Show/hide pulldown-menus.
if (trigger.classList.contains('pulldown-menu')) {
if (trigger.classList.contains("pulldown-menu")) {
this.toggleMenu(trigger, targetId);
}
// Show/hide container.
let container = document.getElementById('hide_' + targetId);
let container = document.getElementById("hide_" + targetId);
if (container) {
this.toggleContainer(container, pressed);
@ -271,14 +264,14 @@ let BookWyrm = new class {
* @return {undefined}
*/
toggleMenu(trigger, targetId) {
let expanded = trigger.getAttribute('aria-expanded') == 'false';
let expanded = trigger.getAttribute("aria-expanded") == "false";
trigger.setAttribute('aria-expanded', expanded);
trigger.setAttribute("aria-expanded", expanded);
if (targetId) {
let target = document.getElementById(targetId);
this.addRemoveClass(target, 'is-active', expanded);
this.addRemoveClass(target, "is-active", expanded);
}
}
@ -290,7 +283,7 @@ let BookWyrm = new class {
* @return {undefined}
*/
toggleContainer(container, pressed) {
this.addRemoveClass(container, 'is-hidden', pressed);
this.addRemoveClass(container, "is-hidden", pressed);
}
/**
@ -327,7 +320,7 @@ let BookWyrm = new class {
node.focus();
setTimeout(function() {
setTimeout(function () {
node.selectionStart = node.selectionEnd = 10000;
}, 0);
}
@ -347,15 +340,17 @@ let BookWyrm = new class {
const relatedforms = document.querySelectorAll(`.${form.dataset.id}`);
// Toggle class on all related forms.
relatedforms.forEach(relatedForm => bookwyrm.addRemoveClass(
relatedForm,
'is-hidden',
relatedForm.className.indexOf('is-hidden') == -1
));
relatedforms.forEach((relatedForm) =>
bookwyrm.addRemoveClass(
relatedForm,
"is-hidden",
relatedForm.className.indexOf("is-hidden") == -1
)
);
this.ajaxPost(form).catch(error => {
this.ajaxPost(form).catch((error) => {
// @todo Display a notification in the UI instead.
console.warn('Request failed:', error);
console.warn("Request failed:", error);
});
}
@ -367,11 +362,11 @@ let BookWyrm = new class {
*/
ajaxPost(form) {
return fetch(form.action, {
method : "POST",
method: "POST",
body: new FormData(form),
headers: {
'Accept': 'application/json',
}
Accept: "application/json",
},
});
}
@ -396,24 +391,106 @@ let BookWyrm = new class {
const element = eventOrElement.currentTarget || eventOrElement;
const submits = element.form.querySelectorAll('[type="submit"]');
const warns = element.parentElement.querySelectorAll('.file-too-big');
const isTooBig = element.files &&
element.files[0] &&
element.files[0].size > MAX_FILE_SIZE_BYTES;
const warns = element.parentElement.querySelectorAll(".file-too-big");
const isTooBig =
element.files && element.files[0] && element.files[0].size > MAX_FILE_SIZE_BYTES;
if (isTooBig) {
submits.forEach(submitter => submitter.disabled = true);
warns.forEach(
sib => addRemoveClass(sib, 'is-hidden', false)
);
submits.forEach((submitter) => (submitter.disabled = true));
warns.forEach((sib) => addRemoveClass(sib, "is-hidden", false));
} else {
submits.forEach(submitter => submitter.disabled = false);
warns.forEach(
sib => addRemoveClass(sib, 'is-hidden', true)
);
submits.forEach((submitter) => (submitter.disabled = false));
warns.forEach((sib) => addRemoveClass(sib, "is-hidden", true));
}
}
/**
* Handle the modal component.
*
* @param {Event} event - Event fired by an element
* with the `data-modal-open` attribute
* pointing to a modal by its id.
* @return {undefined}
*
* See https://github.com/bookwyrm-social/bookwyrm/pull/1633
* for information about using the modal.
*/
handleModalButton(event) {
const modalButton = event.currentTarget;
const targetModalId = modalButton.dataset.modalOpen;
const htmlElement = document.querySelector("html");
const modal = document.getElementById(targetModalId);
if (!modal) {
return;
}
// Helper functions
function handleModalOpen(modalElement) {
htmlElement.classList.add("is-clipped");
modalElement.classList.add("is-active");
modalElement.getElementsByClassName("modal-card")[0].focus();
const closeButtons = modalElement.querySelectorAll("[data-modal-close]");
closeButtons.forEach((button) => {
button.addEventListener("click", function () {
handleModalClose(modalElement);
});
});
document.addEventListener("keydown", function (event) {
if (event.key === "Escape") {
handleModalClose(modalElement);
}
});
modalElement.addEventListener("keydown", handleFocusTrap);
}
function handleModalClose(modalElement) {
modalElement.removeEventListener("keydown", handleFocusTrap);
htmlElement.classList.remove("is-clipped");
modalElement.classList.remove("is-active");
modalButton.focus();
}
function handleFocusTrap(event) {
if (event.key !== "Tab") {
return;
}
const focusableEls = event.currentTarget.querySelectorAll(
[
"a[href]:not([disabled])",
"button:not([disabled])",
"textarea:not([disabled])",
'input:not([type="hidden"]):not([disabled])',
"select:not([disabled])",
"details:not([disabled])",
'[tabindex]:not([tabindex="-1"]):not([disabled])',
].join(",")
);
const firstFocusableEl = focusableEls[0];
const lastFocusableEl = focusableEls[focusableEls.length - 1];
if (event.shiftKey) {
/* Shift + tab */ if (document.activeElement === firstFocusableEl) {
lastFocusableEl.focus();
event.preventDefault();
}
} /* Tab */ else {
if (document.activeElement === lastFocusableEl) {
firstFocusableEl.focus();
event.preventDefault();
}
}
}
// Open modal
handleModalOpen(modal);
}
/**
* Display pop up window.
*
@ -422,31 +499,27 @@ let BookWyrm = new class {
* @return {undefined}
*/
displayPopUp(url, windowName) {
window.open(
url,
windowName,
"left=100,top=100,width=430,height=600"
);
window.open(url, windowName, "left=100,top=100,width=430,height=600");
}
duplicateInput (event ) {
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
const new_count = parent.querySelectorAll("input").length + 1;
let input = orig.cloneNode();
input.id += ("-" + (new_count))
input.value = ""
input.id += "-" + new_count;
input.value = "";
let label = parent.querySelector("label").cloneNode();
label.setAttribute("for", input.id)
label.setAttribute("for", input.id);
parent.appendChild(label)
parent.appendChild(input)
parent.appendChild(label);
parent.appendChild(input);
}
/**
@ -461,25 +534,115 @@ let BookWyrm = new class {
copyText(textareaEl) {
const text = textareaEl.textContent;
const copyButtonEl = document.createElement('button');
const copyButtonEl = document.createElement("button");
copyButtonEl.textContent = textareaEl.dataset.copytextLabel;
copyButtonEl.classList.add(
"mt-2",
"button",
"is-small",
"is-fullwidth",
"is-primary",
"is-light"
);
copyButtonEl.addEventListener('click', () => {
navigator.clipboard.writeText(text).then(function() {
textareaEl.classList.add('is-success');
copyButtonEl.classList.replace('is-primary', 'is-success');
copyButtonEl.classList.add("button", "is-small", "is-primary", "is-light");
copyButtonEl.addEventListener("click", () => {
navigator.clipboard.writeText(text).then(function () {
textareaEl.classList.add("is-success");
copyButtonEl.classList.replace("is-primary", "is-success");
copyButtonEl.textContent = textareaEl.dataset.copytextSuccess;
});
});
textareaEl.parentNode.appendChild(copyButtonEl)
textareaEl.parentNode.appendChild(copyButtonEl);
}
}();
/**
* Handle the details dropdown component.
*
* @param {Event} event - Event fired by a `details` element
* with the `dropdown` class name, on toggle.
* @return {undefined}
*/
handleDetailsDropdown(event) {
const detailsElement = event.target;
const summaryElement = detailsElement.querySelector("summary");
const menuElement = detailsElement.querySelector(".dropdown-menu");
const htmlElement = document.querySelector("html");
if (detailsElement.open) {
// Focus first menu element
menuElement
.querySelectorAll("a[href]:not([disabled]), button:not([disabled])")[0]
.focus();
// Enable focus trap
menuElement.addEventListener("keydown", this.handleFocusTrap);
// Close on Esc
detailsElement.addEventListener("keydown", handleEscKey);
// Clip page if Mobile
if (this.isMobile()) {
htmlElement.classList.add("is-clipped");
}
} else {
summaryElement.focus();
// Disable focus trap
menuElement.removeEventListener("keydown", this.handleFocusTrap);
// Unclip page
if (this.isMobile()) {
htmlElement.classList.remove("is-clipped");
}
}
function handleEscKey(event) {
if (event.key !== "Escape") {
return;
}
summaryElement.click();
}
}
/**
* Check if windows matches mobile media query.
*
* @return {Boolean}
*/
isMobile() {
return window.matchMedia("(max-width: 768px)").matches;
}
/**
* Focus trap handler
*
* @param {Event} event - Keydown event.
* @return {undefined}
*/
handleFocusTrap(event) {
if (event.key !== "Tab") {
return;
}
const focusableEls = event.currentTarget.querySelectorAll(
[
"a[href]:not([disabled])",
"button:not([disabled])",
"textarea:not([disabled])",
'input:not([type="hidden"]):not([disabled])',
"select:not([disabled])",
"details:not([disabled])",
'[tabindex]:not([tabindex="-1"]):not([disabled])',
].join(",")
);
const firstFocusableEl = focusableEls[0];
const lastFocusableEl = focusableEls[focusableEls.length - 1];
if (event.shiftKey) {
/* Shift + tab */ if (document.activeElement === firstFocusableEl) {
lastFocusableEl.focus();
event.preventDefault();
}
} /* Tab */ else {
if (document.activeElement === lastFocusableEl) {
firstFocusableEl.focus();
event.preventDefault();
}
}
}
})();

View file

@ -1,34 +0,0 @@
(function() {
'use strict';
/**
* Toggle all descendant checkboxes of a target.
*
* Use `data-target="ID_OF_TARGET"` on the node on which the event is listened
* to (checkbox, button, link), where_ID_OF_TARGET_ should be the ID of an
* ancestor for the checkboxes.
*
* @example
* <input
* type="checkbox"
* data-action="toggle-all"
* data-target="failed-imports"
* >
* @param {Event} event
* @return {undefined}
*/
function toggleAllCheckboxes(event) {
const mainCheckbox = event.target;
document
.querySelectorAll(`#${mainCheckbox.dataset.target} [type="checkbox"]`)
.forEach(checkbox => checkbox.checked = mainCheckbox.checked);
}
document
.querySelectorAll('[data-action="toggle-all"]')
.forEach(input => {
input.addEventListener('change', toggleAllCheckboxes);
});
})();

View file

@ -1,13 +1,13 @@
/* exported LocalStorageTools */
/* globals BookWyrm */
let LocalStorageTools = new class {
let LocalStorageTools = new (class {
constructor() {
document.querySelectorAll('[data-hide]')
.forEach(t => this.setDisplay(t));
document.querySelectorAll("[data-hide]").forEach((t) => this.setDisplay(t));
document.querySelectorAll('.set-display')
.forEach(t => t.addEventListener('click', this.updateDisplay.bind(this)));
document
.querySelectorAll(".set-display")
.forEach((t) => t.addEventListener("click", this.updateDisplay.bind(this)));
}
/**
@ -23,8 +23,9 @@ let LocalStorageTools = new class {
window.localStorage.setItem(key, value);
document.querySelectorAll('[data-hide="' + key + '"]')
.forEach(node => this.setDisplay(node));
document
.querySelectorAll('[data-hide="' + key + '"]')
.forEach((node) => this.setDisplay(node));
}
/**
@ -38,6 +39,6 @@ let LocalStorageTools = new class {
let key = node.dataset.hide;
let value = window.localStorage.getItem(key);
BookWyrm.addRemoveClass(node, 'is-hidden', value);
BookWyrm.addRemoveClass(node, "is-hidden", value);
}
}();
})();

View file

@ -1,22 +1,21 @@
/* exported StatusCache */
/* globals BookWyrm */
let StatusCache = new class {
let StatusCache = new (class {
constructor() {
document.querySelectorAll('[data-cache-draft]')
.forEach(t => t.addEventListener('change', this.updateDraft.bind(this)));
document
.querySelectorAll("[data-cache-draft]")
.forEach((t) => t.addEventListener("change", this.updateDraft.bind(this)));
document.querySelectorAll('[data-cache-draft]')
.forEach(t => this.populateDraft(t));
document.querySelectorAll("[data-cache-draft]").forEach((t) => this.populateDraft(t));
document.querySelectorAll('.submit-status')
.forEach(button => button.addEventListener(
'submit',
this.submitStatus.bind(this))
);
document
.querySelectorAll(".submit-status")
.forEach((button) => button.addEventListener("submit", this.submitStatus.bind(this)));
document.querySelectorAll('.form-rate-stars label.icon')
.forEach(button => button.addEventListener('click', this.toggleStar.bind(this)));
document
.querySelectorAll(".form-rate-stars label.icon")
.forEach((button) => button.addEventListener("click", this.toggleStar.bind(this)));
}
/**
@ -80,25 +79,26 @@ let StatusCache = new class {
event.preventDefault();
BookWyrm.addRemoveClass(form, 'is-processing', true);
trigger.setAttribute('disabled', null);
BookWyrm.addRemoveClass(form, "is-processing", true);
trigger.setAttribute("disabled", null);
BookWyrm.ajaxPost(form).finally(() => {
// Change icon to remove ongoing activity on the current UI.
// Enable back the element used to submit the form.
BookWyrm.addRemoveClass(form, 'is-processing', false);
trigger.removeAttribute('disabled');
})
.then(response => {
if (!response.ok) {
throw new Error();
}
this.submitStatusSuccess(form);
})
.catch(error => {
console.warn(error);
this.announceMessage('status-error-message');
});
BookWyrm.ajaxPost(form)
.finally(() => {
// Change icon to remove ongoing activity on the current UI.
// Enable back the element used to submit the form.
BookWyrm.addRemoveClass(form, "is-processing", false);
trigger.removeAttribute("disabled");
})
.then((response) => {
if (!response.ok) {
throw new Error();
}
this.submitStatusSuccess(form);
})
.catch((error) => {
console.warn(error);
this.announceMessage("status-error-message");
});
}
/**
@ -112,12 +112,16 @@ let StatusCache = new class {
let copy = element.cloneNode(true);
copy.id = null;
element.insertAdjacentElement('beforebegin', copy);
element.insertAdjacentElement("beforebegin", copy);
BookWyrm.addRemoveClass(copy, 'is-hidden', false);
setTimeout(function() {
copy.remove();
}, 10000, copy);
BookWyrm.addRemoveClass(copy, "is-hidden", false);
setTimeout(
function () {
copy.remove();
},
10000,
copy
);
}
/**
@ -131,8 +135,9 @@ let StatusCache = new class {
form.reset();
// Clear localstorage
form.querySelectorAll('[data-cache-draft]')
.forEach(node => window.localStorage.removeItem(node.dataset.cacheDraft));
form.querySelectorAll("[data-cache-draft]").forEach((node) =>
window.localStorage.removeItem(node.dataset.cacheDraft)
);
// Close modals
let modal = form.closest(".modal.is-active");
@ -142,8 +147,11 @@ let StatusCache = new class {
// Update shelve buttons
if (form.reading_status) {
document.querySelectorAll("[data-shelve-button-book='" + form.book.value +"']")
.forEach(button => this.cycleShelveButtons(button, form.reading_status.value));
document
.querySelectorAll("[data-shelve-button-book='" + form.book.value + "']")
.forEach((button) =>
this.cycleShelveButtons(button, form.reading_status.value)
);
}
return;
@ -156,7 +164,7 @@ let StatusCache = new class {
document.querySelector("[data-controls=" + reply.id + "]").click();
}
this.announceMessage('status-success-message');
this.announceMessage("status-success-message");
}
/**
@ -172,8 +180,9 @@ let StatusCache = new class {
let next_identifier = shelf.dataset.shelfNext;
// Set all buttons to hidden
button.querySelectorAll("[data-shelf-identifier]")
.forEach(item => BookWyrm.addRemoveClass(item, "is-hidden", true));
button
.querySelectorAll("[data-shelf-identifier]")
.forEach((item) => BookWyrm.addRemoveClass(item, "is-hidden", true));
// Button that should be visible now
let next = button.querySelector("[data-shelf-identifier=" + next_identifier + "]");
@ -183,15 +192,17 @@ let StatusCache = new class {
// ------ update the dropdown buttons
// Remove existing hidden class
button.querySelectorAll("[data-shelf-dropdown-identifier]")
.forEach(item => BookWyrm.addRemoveClass(item, "is-hidden", false));
button
.querySelectorAll("[data-shelf-dropdown-identifier]")
.forEach((item) => BookWyrm.addRemoveClass(item, "is-hidden", false));
// Remove existing disabled states
button.querySelectorAll("[data-shelf-dropdown-identifier] button")
.forEach(item => item.disabled = false);
button
.querySelectorAll("[data-shelf-dropdown-identifier] button")
.forEach((item) => (item.disabled = false));
next_identifier = next_identifier == 'complete' ? 'read' : next_identifier;
next_identifier = next_identifier == "complete" ? "read" : next_identifier;
// Disable the current state
button.querySelector(
@ -206,8 +217,9 @@ let StatusCache = new class {
BookWyrm.addRemoveClass(main_button, "is-hidden", true);
// Just hide the other two menu options, idk what to do with them
button.querySelectorAll("[data-extra-options]")
.forEach(item => BookWyrm.addRemoveClass(item, "is-hidden", true));
button
.querySelectorAll("[data-extra-options]")
.forEach((item) => BookWyrm.addRemoveClass(item, "is-hidden", true));
// Close menu
let menu = button.querySelector("details[open]");
@ -235,5 +247,4 @@ let StatusCache = new class {
halfStar.checked = "checked";
}
}
}();
})();

View file

@ -0,0 +1,273 @@
{% extends 'layout.html' %}
{% load i18n %}
{% load static %}
{% load humanize %}
{% block title %}{% blocktrans %}{{ year }} in the books{% endblocktrans %}{% endblock %}
{% block head_links %}
<link rel="stylesheet" href="{% static "css/vendor/dm_serif_display.css" %}">
{% endblock %}
{% block content %}
{% with display_name=summary_user.display_name %}
{% if user == summary_user %}
<div class="columns">
{% with year=paginated_years|first %}
{% if year %}
<div class="column">
<a href="{% url 'annual-summary' summary_user.localname year %}">
<span class="icon icon-arrow-left" aria-hidden="true"></span>
{{ year }}
</a>
</div>
{% endif %}
{% endwith %}
{% with year=paginated_years|last %}
{% if year %}
<div class="column has-text-right">
<a href="{% url 'annual-summary' summary_user.localname year %}">
{{ year }}
<span class="icon icon-arrow-right" aria-hidden="true"></span>
</a>
</div>
{% endif %}
{% endwith %}
</div>
{% endif %}
<h1 class="title is-1 is-serif has-text-centered">
📚✨
{% blocktrans %}{{ year }} <em>in the books</em>{% endblocktrans %}
✨📚
</h1>
<p class="subtitle is-3 is-serif has-text-centered mb-5">
{% blocktrans %}<em>{{ display_name }}s</em> year of reading{% endblocktrans %}
</p>
<details>
<summary class="has-text-centered">
<span role="heading" aria-level="2" class="title is-6 has-text-success-dark">
{% trans "Share this page" %}
</span>
</summary>
<div class="columns mt-3">
<div class="column is-three-fifths is-offset-one-fifth">
{% if year_key %}
<div class="horizontal-copy mb-5">
<textarea
rows="1"
readonly
class="textarea is-small"
aria-labelledby="embed-label"
data-copytext
data-copytext-label="{% trans 'Copy address' %}"
data-copytext-success="{% trans 'Copied!' %}"
>{{ request.scheme|add:"://"|add:request.get_host|add:request.path }}?key={{ year_key }}</textarea>
</div>
{% endif %}
{% if user == summary_user %}
{% if year_key %}
<div class="columns mb-2">
<div class="column pb-0">
<p>{% trans "Sharing status: <strong>public with key</strong>" %}</p>
<p>{% trans "The page can be seen by anyone with the complete address." %}</p>
</div>
<form class="column pb-0 is-narrow" method="post" action="{% url "summary-revoke-key" %}" id="revoke-key">
{% csrf_token %}
<input type="hidden" name="year" value="{{ year }}" />
<button class="button is-danger is-outlined" type="submit">{% trans "Make page private" %}</button>
</form>
</div>
{% else %}
<div class="columns">
<div class="column pb-0">
<p>{% trans "Sharing status: <strong>private</strong>" %}</p>
<p>{% trans "The page is private, only you can see it." %}</p>
</div>
<form class="column pb-0 is-narrow" method="post" action="{% url "summary-add-key" %}" id="add-key">
{% csrf_token %}
<input type="hidden" name="year" value="{{ year }}" />
<button class="button is-primary is-outlined" type="submit">{% trans "Make page public" %}</button>
</form>
</div>
{% endif %}
<p class="help">{% trans "When you make your page private, the old key wont give access to the page anymore. A new key will be created if the page is once again made public." %}</p>
{% endif %}
</div>
</div>
</details>
<div class="columns mt-1">
<div class="column is-one-fifth is-offset-two-fifths">
<hr />
</div>
</div>
{% if not books %}
<p class="has-text-centered is-size-5">{% blocktrans %}Sadly {{ display_name }} didnt finish any book in {{ year }}{% endblocktrans %}</p>
{% else %}
<div class="columns is-mobile">
<div class="column is-8 is-offset-2 has-text-centered">
<h2 class="title is-3 is-serif">
{% blocktrans trimmed count counter=books_total with pages_total=pages_total|intcomma %}
In {{ year }}, {{ display_name }} read {{ books_total }} book<br />for a total of {{ pages_total }} pages!
{% plural %}
In {{ year }}, {{ display_name }} read {{ books_total }} books<br />for a total of {{ pages_total }} pages!
{% endblocktrans %}
</h2>
<p class="subtitle is-5">{% trans "Thats great!" %}</p>
<p class="title is-4 is-serif">
{% blocktrans with pages=pages_average|intcomma %}That makes an average of {{ pages }} pages per book.{% endblocktrans %}
</p>
{% if no_page_number %}
<p class="subtitle is-6">
{% blocktrans trimmed count counter=no_page_number %}
({{ no_page_number }} book doesnt have pages)
{% plural %}
({{ no_page_number }} books dont have pages)
{% endblocktrans %}
</p>
{% endif %}
</div>
</div>
{% if book_pages_lowest and book_pages_highest %}
<div class="columns is-align-items-center mt-5">
<div class="column is-2 is-offset-1">
<a href="{{ book_pages_lowest.local_path }}">{% include 'snippets/book_cover.html' with book=book_pages_lowest cover_class='is-w-auto-tablet is-h-l-mobile' size='xxlarge' %}</a>
</div>
<div class="column is-3">
{% trans "Their shortest read this year…" %}
<p class="title is-4 is-serif is-italic">
<a href="{{ book_pages_lowest.local_path }}" class="has-text-success-dark">
{{ book_pages_lowest.title }}
</a>
</p>
{% if book_pages_lowest.authors.exists %}
<p class="subtitle is-5 mb-2">{% trans "by" %}
{% include 'snippets/authors.html' with book=book_pages_lowest link_class="has-text-success-dark" %}
</p>
{% endif %}
<p class="subtitle is-6">
{% with pages=book_pages_lowest.pages %}
{% blocktrans %}<strong>{{ pages }}</strong> pages{% endblocktrans%}
{% endwith %}
</p>
</div>
<div class="column is-2">
<a href="{{ book_pages_highest.local_path }}">{% include 'snippets/book_cover.html' with book=book_pages_highest cover_class='is-w-auto-tablet is-h-l-mobile' size='xxlarge' %}</a>
</div>
<div class="column is-3">
{% trans "…and the longest" %}
<p class="title is-4 is-serif is-italic">
<a href="{{ book_pages_lowest.local_path }}" class="has-text-success-dark">
{{ book_pages_highest.title }}
</a>
</p>
{% if book_pages_highest.authors.exists %}
<p class="subtitle is-5 mb-2">{% trans "by" %}
{% include 'snippets/authors.html' with book=book_pages_highest link_class="has-text-success-dark" %}
</p>
{% endif %}
<p class="subtitle is-6">
{% with pages=book_pages_highest.pages %}
{% blocktrans %}<strong>{{ pages }}</strong> pages{% endblocktrans%}
{% endwith %}
</p>
</div>
</div>
{% endif %}
<div class="columns">
<div class="column is-one-fifth is-offset-two-fifths">
<hr />
</div>
</div>
{% if ratings_total > 0 %}
<div class="columns">
<div class="column has-text-centered">
<h2 class="title is-3 is-serif">
{% blocktrans trimmed count counter=ratings_total %}
{{ display_name }} left {{ ratings_total }} rating, <br />their average rating is {{ rating_average }}
{% plural %}
{{ display_name }} left {{ ratings_total }} ratings, <br />their average rating is {{ rating_average }}
{% endblocktrans %}
</h2>
</div>
</div>
<div class="columns is-align-items-center">
<div class="column is-2 is-offset-4">
<a href="{{ book_rating_highest.book.local_path }}">{% include 'snippets/book_cover.html' with book=book_rating_highest.book cover_class='is-w-xl-tablet is-h-l-mobile' size='xxlarge' %}</a>
</div>
{% if book_rating_highest %}
<div class="column is-4">
{% trans "Their best rated review" %}
<p class="title is-4 is-serif is-italic">
<a href="{{ book_rating_highest.book.local_path }}" class="has-text-success-dark">
{{ book_rating_highest.book.title }}
</a>
</p>
{% if book_rating_highest.book.authors.exists %}
<p class="subtitle is-5 mb-2">{% trans "by" %}
{% include 'snippets/authors.html' with book=book_rating_highest.book link_class="has-text-success-dark" %}
</p>
{% endif %}
<p class="subtitle is-6">
{% with rating=book_rating_highest.rating|floatformat %}
{% blocktrans %}Their rating: <strong>{{ rating }}</strong>{% endblocktrans%}
{% endwith %}
</p>
</div>
{% endif %}
</div>
<div class="columns">
<div class="column is-one-fifth is-offset-two-fifths">
<hr />
</div>
</div>
{% endif %}
<div class="columns">
<div class="column has-text-centered">
<h2 class="title is-3 is-serif">
{% blocktrans %}All the books {{ display_name }} read in {{ year }}{% endblocktrans %}
</h2>
</div>
</div>
<div class="columns">
<div class="column is-10 is-offset-1">
<div class="books-grid">
{% for book in books %}
{% if books_total > 12 and book.id in best_ratings_books_ids %}
<a href="{{ book.local_path }}" class="has-text-centered is-big has-text-success-dark">
{% include 'snippets/book_cover.html' with book=book cover_class='is-w-auto' size='xxlarge' %}
<span class="book-title is-serif is-size-5">
{{ book.title }}
</span>
</a>
{% else %}
<a href="{{ book.local_path }}" class="has-text-centered has-text-success-dark">
{% include 'snippets/book_cover.html' with book=book cover_class='is-w-auto' size='xlarge' %}
<span class="book-title is-serif is-size-6">
{{ book.title }}
</span>
</a>
{% endif %}
{% endfor %}
</div>
</div>
</div>
{% endif %}
{% endwith %}
{% endblock %}

View file

@ -61,24 +61,48 @@
<div class="columns">
<div class="column is-one-fifth">
{% include 'snippets/book_cover.html' with size='xxlarge' size_mobile='medium' book=book cover_class='is-h-m-mobile' %}
{% if not book.cover %}
{% if user_authenticated %}
<button type="button" data-controls="add_cover_{{ book.id }}" data-focus-target="modal_title_add_cover_{{ book.id }}" aria-pressed="false" class="cover-container no-cover is-h-m-mobile">
<img
class="book-cover"
src="{% static "images/no_cover.jpg" %}"
alt=""
aria-hidden="true"
>
<span class="cover-caption">
<span>{{ book.alt_text }}</span>
<span>{% trans "Click to add cover" %}</span>
</span>
<span class="button-invisible-overlay has-text-centered">
{% trans "Click to add cover" %}
</span>
</button>
{% include 'book/cover_add_modal.html' with book=book controls_text="add_cover" controls_uid=book.id %}
{% if request.GET.cover_error %}
<p class="help is-danger">{% trans "Failed to load cover" %}</p>
{% endif %}
{% else %}
{% include 'snippets/book_cover.html' with book=book cover_class='is-h-m-mobile' %}
{% endif %}
{% endif %}
{% if book.cover %}
<button type="button" data-modal-open="cover_show_modal" class="cover-container is-h-m-mobile is-relative">
{% include 'snippets/book_cover.html' with size='xxlarge' size_mobile='medium' book=book cover_class='is-h-m-mobile' %}
<span class="button-invisible-overlay has-text-centered">
{% trans "Click to enlarge" %}
</span>
</button>
{% include 'book/cover_show_modal.html' with book=book id="cover_show_modal" %}
{% endif %}
{% include 'snippets/rate_action.html' with user=request.user book=book %}
<div class="mb-3">
{% include 'snippets/shelve_button/shelve_button.html' %}
</div>
{% if user_authenticated and not book.cover %}
<div class="block">
{% trans "Add cover" as button_text %}
{% include 'snippets/toggle/toggle_button.html' with text=button_text controls_text="add_cover" controls_uid=book.id focus="modal_title_add_cover" class="is-small" %}
{% include 'book/cover_modal.html' with book=book controls_text="add_cover" controls_uid=book.id %}
{% if request.GET.cover_error %}
<p class="help is-danger">{% trans "Failed to load cover" %}</p>
{% endif %}
</div>
{% endif %}
<section class="is-clipped">
{% with book=book %}
<div class="content">

View file

@ -0,0 +1,12 @@
{% load i18n %}
{% load static %}
<div class="modal" id="{{ id }}">
<div class="modal-background" data-modal-close></div><!-- modal background -->
<div class="modal-card is-align-items-center" role="dialog" aria-modal="true" tabindex="-1" aria-label="{% trans 'Book cover preview' %}">
<div class="cover-container">
<img class="book-cover" src="{% get_media_prefix %}{{ book.cover }}" itemprop="thumbnailUrl" alt="">
</div>
</div>
<button type="button" data-modal-close class="modal-close is-large" aria-label="{% trans 'Close' %}"></button>
</div>

View file

@ -7,6 +7,7 @@
class="
dropdown control
{% if right %}is-right{% endif %}
has-text-left
"
>
<summary
@ -15,7 +16,7 @@
{% block dropdown-trigger %}{% endblock %}
</summary>
<div class="dropdown-menu control">
<div class="dropdown-menu">
<ul
id="menu_options_{{ uuid }}"
class="dropdown-content p-0 is-clipped"

View file

@ -64,14 +64,20 @@
{{ allowed_status_types|json_script:"unread-notifications-wrapper" }}
</a>
{% if request.user.show_goal and not goal and tab.key == 'home' %}
{% now 'Y' as year %}
<section class="block">
{% include 'feed/goal_card.html' with year=year %}
<hr>
</section>
{% endif %}
{% if request.user.show_goal and not goal and tab.key == 'home' %}
{% now 'Y' as year %}
<section class="block">
{% include 'feed/goal_card.html' with year=year %}
<hr>
</section>
{% endif %}
{% if annual_summary_year and tab.key == 'home' %}
<section class="block" data-hide="hide_annual_summary_{{ annual_summary_year }}">
{% include 'feed/summary_card.html' with year=annual_summary_year %}
<hr>
</section>
{% endif %}
{% endif %}
{# activity feed #}

View file

@ -31,7 +31,7 @@
</div>
{% endif %}
{% endfor %}
<div class="is-main block" id="anchor-{{ status.id }}">
<div class="is-main block">
{% include 'snippets/status/status.html' with status=status main=True %}
</div>

View file

@ -0,0 +1,31 @@
{% load i18n %}
<article class="card">
<header class="card-header has-background-success-dark">
<h3 class="card-header-title has-text-white">
<span class="icon is-size-3 mr-2" aria-hidden="true">📚</span>
<span class="icon is-size-3 mr-2" aria-hidden="true"></span>
{% blocktrans %}{{ year }} in the books{% endblocktrans %}
</h3>
<div class="card-header-icon has-text-white">
{% trans "Dismiss message" as button_text %}
<button class="delete set-display" type="button" data-id="hide_annual_summary_{{ year }}" data-value="true">
<span>{% trans "Dismiss message" %}</span>
</button>
</div>
</header>
<section class="card-content">
<p class="mb-3">
{% blocktrans %}The end of the year is the best moment to take stock of all the books read during the last 12 months. How many pages have you read? Which book is your best-rated of the year? We compiled these stats, and more!{% endblocktrans %}
</p>
<p>
<a href="{% url 'annual-summary' request.user.localname year %}" class="button is-success has-background-success-dark">
{% blocktrans %}Discover your stats for {{ year }}!{% endblocktrans %}
</a>
</p>
</section>
</article>

View file

@ -10,7 +10,12 @@
<div class="modal-background"></div>
<div class="modal-card is-fullwidth">
<header class="modal-card-head">
<img class="image logo mr-2" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}" aria-hidden="true">
<img
class="image logo mr-2"
src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}"
aria-hidden="true"
alt="{{ site.name }}"
>
<h1 class="modal-card-title" id="get_started_header">
{% blocktrans %}Welcome to {{ site_name }}!{% endblocktrans %}
<span class="subtitle is-block">

View file

@ -13,13 +13,26 @@
<div class="column is-two-thirds">
<div class="block">
<label class="label" for="id_name">{% trans "Display name:" %}</label>
<input type="text" name="name" maxlength="100" class="input" id="id_name" placeholder="{{ user.localname }}" value="{% if request.user.name %}{{ request.user.name }}{% endif %}">
<input
type="text"
name="name"
maxlength="100"
class="input"
id="id_name"
placeholder="{{ user.localname }}"
value="{% if request.user.name %}{{ request.user.name }}{% endif %}"
>
{% include 'snippets/form_errors.html' with errors_list=form.name.errors id="desc_name" %}
</div>
<div class="block">
<label class="label" for="id_summary">{% trans "Summary:" %}</label>
<textarea name="summary" cols="None" rows="None" class="textarea" id="id_summary" placeholder="{% trans 'A little bit about you' %}">{% if request.user.summary %}{{ request.user.summary }}{% endif %}</textarea>
<textarea
name="summary"
class="textarea"
id="id_summary"
placeholder="{% trans 'A little bit about you' %}"
>{% if request.user.summary %}{{ request.user.summary }}{% endif %}</textarea>
{% include 'snippets/form_errors.html' with errors_list=form.summary.errors id="desc_summary" %}
</div>

View file

@ -234,7 +234,3 @@
</div>
{% endif %}
{% endspaceless %}{% endblock %}
{% block scripts %}
<script src="{% static "js/check_all.js" %}?v={{ js_cache }}"></script>
{% endblock %}

View file

@ -28,6 +28,8 @@
{% include 'snippets/opengraph_images.html' %}
{% endblock %}
<meta name="twitter:image:alt" content="BookWyrm Logo">
{% block head_links %}{% endblock %}
</head>
<body>
<nav class="navbar" aria-label="main navigation">
@ -36,7 +38,7 @@
<a class="navbar-item" href="/">
<img class="image logo" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}" alt="{% blocktrans with site_name=site.name %}{{ site_name }} home page{% endblocktrans %}">
</a>
<form class="navbar-item column" action="{% url 'search' %}">
<form class="navbar-item column is-align-items-start pt-5" action="{% url 'search' %}">
<div class="field has-addons">
<div class="control">
{% if user.is_authenticated %}
@ -56,25 +58,22 @@
</div>
</form>
<div role="button" tabindex="0" class="navbar-burger pulldown-menu" data-controls="main_nav" aria-expanded="false">
<div class="navbar-item mt-3">
<div class="icon icon-dots-three-vertical" title="{% trans 'Main navigation menu' %}">
<span class="is-sr-only">{% trans "Main navigation menu" %}</span>
</div>
</div>
</div>
<button type="button" tabindex="0" class="navbar-burger pulldown-menu my-4" data-controls="main_nav" aria-expanded="false">
<i class="icon icon-dots-three-vertical" aria-hidden="true"></i>
<span class="is-sr-only">{% trans "Main navigation menu" %}</span>
</button>
</div>
<div class="navbar-menu" id="main_nav">
<div class="navbar-start">
{% if request.user.is_authenticated %}
<a href="/#feed" class="navbar-item">
<a href="/#feed" class="navbar-item mt-3 py-0">
{% trans "Feed" %}
</a>
<a href="{% url 'lists' %}" class="navbar-item">
<a href="{% url 'lists' %}" class="navbar-item mt-3 py-0">
{% trans "Lists" %}
</a>
<a href="{% url 'discover' %}" class="navbar-item">
<a href="{% url 'discover' %}" class="navbar-item mt-3 py-0">
{% trans "Discover" %}
</a>
{% endif %}
@ -82,7 +81,7 @@
<div class="navbar-end">
{% if request.user.is_authenticated %}
<div class="navbar-item has-dropdown is-hoverable">
<div class="navbar-item mt-3 py-0 has-dropdown is-hoverable">
<a
href="{{ request.user.local_path }}"
class="navbar-link pulldown-menu"
@ -141,7 +140,7 @@
</li>
</ul>
</div>
<div class="navbar-item">
<div class="navbar-item mt-3 py-0">
<a href="{% url 'notifications' %}" class="tags has-addons">
<span class="tag is-medium">
<span class="icon icon-bell" title="{% trans 'Notifications' %}">
@ -159,7 +158,7 @@
</a>
</div>
{% else %}
<div class="navbar-item">
<div class="navbar-item pt-5 pb-0">
{% if request.path != '/login' and request.path != '/login/' %}
<div class="columns">
<div class="column">

View file

@ -54,13 +54,13 @@
{% csrf_token %}
<input type="hidden" name="item" value="{{ item.id }}">
<input type="hidden" name="approved" value="true">
<button class="button">{% trans "Approve" %}</button>
<button type="submit" class="button">{% trans "Approve" %}</button>
</form>
<form class="control" method="POST" action="{% url 'list-curate' list.id %}">
{% csrf_token %}
<input type="hidden" name="item" value="{{ item.id }}">
<input type="hidden" name="approved" value="false">
<button class="button is-danger is-light">{% trans "Discard" %}</button>
<button type="submit" class="button is-danger is-light">{% trans "Discard" %}</button>
</form>
</dd>
</div>

View file

@ -18,24 +18,73 @@
<fieldset class="field">
<legend class="label">{% trans "List curation:" %}</legend>
<label class="field" data-hides="list_group_selector">
<input type="radio" name="curation" value="closed"{% if not list or list.curation == 'closed' %} checked{% endif %}> {% trans "Closed" %}
<p class="help mb-2">{% trans "Only you can add and remove books to this list" %}</p>
</label>
<div class="field" data-hides="list_group_selector">
<input
type="radio"
name="curation"
value="closed"
aria-described-by="id_curation_closed_help"
id="id_curation_closed"
{% if not list or list.curation == 'closed' %} checked{% endif %}
>
<label for="id_curation_closed">
{% trans "Closed" %}
</label>
<p class="help mb-2" id="id_curation_closed_help">
{% trans "Only you can add and remove books to this list" %}
</p>
</div>
<label class="field" data-hides="list_group_selector">
<input type="radio" name="curation" value="curated"{% if list.curation == 'curated' %} checked{% endif %}> {% trans "Curated" %}
<p class="help mb-2">{% trans "Anyone can suggest books, subject to your approval" %}</p>
</label>
<div class="field" data-hides="list_group_selector">
<input
type="radio"
name="curation"
value="curated"
aria-described-by="id_curation_curated_help"
id="id_curation_curated"
{% if list.curation == 'curated' %} checked{% endif %}
>
<label for="id_curation_curated">
{% trans "Curated" %}
</label>
<p class="help mb-2" id="id_curation_curated_help">
{% trans "Anyone can suggest books, subject to your approval" %}
</p>
</div>
<label class="field" data-hides="list_group_selector">
<input type="radio" name="curation" value="open"{% if list.curation == 'open' %} checked{% endif %}> {% trans "Open" context "curation type" %}
<p class="help mb-2">{% trans "Anyone can add books to this list" %}</p>
</label>
<div class="field" data-hides="list_group_selector">
<input
type="radio"
name="curation"
value="open"
aria-described-by="id_curation_open_help"
id="id_curation_open"
{% if list.curation == 'open' %} checked{% endif %}
>
<label for="id_curation_open">
{% trans "Open" context "curation type" %}
</label>
<p class="help mb-2" id="id_curation_open_help">
{% trans "Anyone can add books to this list" %}
</p>
</div>
<div class="field hidden-form">
<input
type="radio"
name="curation"
value="group"
aria-described-by="id_curation_group_help"
id="id_curation_group"
{% if list.curation == 'group' %}checked{% endif %}
>
<label for="id_curation_group">
{% trans "Group" %}
</label>
<p class="help mb-2" id="id_curation_group_help">
{% trans "Group members can add to and remove from this list" %}
</p>
<label class="field hidden-form">
<input type="radio" name="curation" value="group"{% if list.curation == 'group' %} checked{% endif %} > {% trans "Group" %}
<p class="help mb-2">{% trans "Group members can add to and remove from this list" %}</p>
<fieldset class="{% if list.curation != 'group' %}is-hidden{% endif %}" id="list_group_selector">
{% if user.memberships.exists %}
<label class="label" for="id_group" id="group">{% trans "Select Group" %}</label>
@ -61,7 +110,7 @@
{% endwith %}
{% endif %}
</fieldset>
</label>
</div>
</fieldset>
</div>
</div>

View file

@ -56,37 +56,48 @@
<div>
{{ book|book_description|to_markdown|default:""|safe|truncatewords_html:20 }}
</div>
{% include 'snippets/shelve_button/shelve_button.html' %}
{% include 'snippets/shelve_button/shelve_button.html' with book=book %}
</div>
</div>
{% endwith %}
<div class="card-footer is-stacked-mobile has-background-white-bis is-align-items-stretch">
<div class="card-footer-item">
<div>
<p>{% blocktrans with username=item.user.display_name user_path=item.user.local_path %}Added by <a href="{{ user_path }}">{{ username }}</a>{% endblocktrans %}</p>
</div>
<p>
{% blocktrans trimmed with username=item.user.display_name user_path=item.user.local_path %}
Added by <a href="{{ user_path }}">{{ username }}</a>
{% endblocktrans %}
</p>
</div>
{% if list.user == request.user or list.group|is_member:request.user %}
<div class="card-footer-item">
<form name="set-position" method="post" action="{% url 'list-set-book-position' item.id %}">
{% csrf_token %}
<div class="field has-addons mb-0">
<div class="control">
<label for="input-list-position" class="button is-transparent is-small">{% trans "List position" %}</label>
</div>
<div class="control">
<input id="input_list_position" class="input is-small" type="number" min="1" name="position" value="{{ item.order }}">
</div>
<div class="control">
<button type="submit" class="button is-info is-small is-tablet">{% trans "Set" %}</button>
</div>
<form
name="set-position-{{ item.id }}"
method="post"
action="{% url 'list-set-book-position' item.id %}"
class="card-footer-item"
>
{% csrf_token %}
<div class="field has-addons mb-0">
<div class="control">
<label for="input-list-position" class="button is-transparent is-small">{% trans "List position" %}</label>
</div>
</form>
</div>
<div class="control">
<input id="input_list_position_{{ item.id }}" class="input is-small" type="number" min="1" name="position" value="{{ item.order }}">
</div>
<div class="control">
<button type="submit" class="button is-info is-small is-tablet">{% trans "Set" %}</button>
</div>
</div>
</form>
{% endif %}
{% if list.user == request.user or list.curation == 'open' and item.user == request.user or list.group|is_member:request.user %}
<form name="remove-book" method="post" action="{% url 'list-remove-book' list.id %}" class="card-footer-item">
<form
name="remove-book-{{ item.id }}"
method="post"
action="{% url 'list-remove-book' list.id %}"
class="card-footer-item"
>
{% csrf_token %}
<input type="hidden" name="item" value="{{ item.id }}">
<button type="submit" class="button is-small is-danger">{% trans "Remove" %}</button>
@ -172,14 +183,20 @@
<form
class="mt-1"
name="add-book"
name="add-book-{{ book.id }}"
method="post"
action="{% url 'list-add-book' %}{% if query %}?q={{ query }}{% endif %}"
>
{% 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>
<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>
</div>
</div>
@ -190,7 +207,18 @@
<h2 class="title is-5 mt-6" id="embed-label">
{% trans "Embed this list on a website" %}
</h2>
<textarea readonly class="textarea is-small" aria-labelledby="embed-label" data-copytext data-copytext-label="{% trans 'Copy embed code' %}" data-copytext-success="{% trans 'Copied!' %}"><iframe style="border-width:0;" id="bookwyrm_list_embed" width="400" height="600" title="{% blocktrans with list_name=list.name site_name=site.name owner=list.user.display_name %}{{ list_name }}, a list by {{owner}} on {{ site_name }}{% endblocktrans %}" src="{{ embed_url }}"></iframe></textarea>
<div class="vertical-copy">
<textarea
readonly
class="textarea is-small"
aria-labelledby="embed-label"
data-copytext
data-copytext-label="{% trans 'Copy embed code' %}"
data-copytext-success="{% trans 'Copied!' %}"
>&lt;iframe style="border-width:0;" id="bookwyrm_list_embed" width="400" height="600" title="{% blocktrans trimmed with list_name=list.name site_name=site.name owner=list.user.display_name %}
{{ list_name }}, a list by {{owner}} on {{ site_name }}
{% endblocktrans %}" src="{{ embed_url }}"&gt;&lt;/iframe&gt;</textarea>
</div>
</div>
</section>

View file

@ -13,7 +13,7 @@
<form class="block" action="{% url 'search' %}" method="GET">
<div class="field has-addons">
<div class="control">
<input type="input" class="input" name="q" value="{{ query }}" aria-label="{% trans 'Search query' %}">
<input type="text" class="input" name="q" value="{{ query }}" aria-label="{% trans 'Search query' %}">
</div>
<div class="control">
<div class="select" aria-label="{% trans 'Search type' %}">

View file

@ -31,35 +31,29 @@
<div class="block content">
<dl>
<div class="is-flex notification pt-1 pb-1 mb-0 {% if announcement in active_announcements %}is-success{% else %}is-danger{% endif %}">
<dt class="mr-1 has-text-weight-bold">{% trans "Visible:" %}</dt>
<dd>
{% if announcement in active_announcements %}
{% trans "True" %}
{% else %}
{% trans "False" %}
{% endif %}
</dd>
</div>
<dt class="is-pulled-left mr-5 has-text-weight-bold">{% trans "Visible:" %}</dt>
<dd>
<span class="tag {% if announcement in active_announcements %}is-success{% else %}is-danger{% endif %}">
{% if announcement in active_announcements %}
{% trans "True" %}
{% else %}
{% trans "False" %}
{% endif %}
</span>
</dd>
{% if announcement.start_date %}
<div class="is-flex notificationi pt-1 pb-1 mb-0 has-background-white">
<dt class="mr-1 has-text-weight-bold">{% trans "Start date:" %}</dt>
<dd>{{ announcement.start_date|naturalday }}</dd>
</div>
<dt class="is-pulled-left mr-5 has-text-weight-bold">{% trans "Start date:" %}</dt>
<dd>{{ announcement.start_date|naturalday }}</dd>
{% endif %}
{% if announcement.end_date %}
<div class="is-flex notification pt-1 pb-1 mb-0 has-background-white">
<dt class="mr-1 has-text-weight-bold">{% trans "End date:" %}</dt>
<dd>{{ announcement.end_date|naturalday }}</dd>
</div>
<dt class="is-pulled-left mr-5 has-text-weight-bold">{% trans "End date:" %}</dt>
<dd>{{ announcement.end_date|naturalday }}</dd>
{% endif %}
<div class="is-flex notification pt-1 pb-1 has-background-white">
<dt class="mr-1 has-text-weight-bold">{% trans "Active:" %}</dt>
<dd>{{ announcement.active }}</dd>
</div>
<dt class="is-pulled-left mr-5 has-text-weight-bold">{% trans "Active:" %}</dt>
<dd>{{ announcement.active }}</dd>
</dl>
<hr aria-hidden="true">

View file

@ -13,7 +13,7 @@
{% for author in book.authors.all|slice:limit %}
<a
href="{{ author.local_path }}"
class="author"
class="author {{ link_class }}"
itemprop="author"
itemscope
itemtype="https://schema.org/Thing"

View file

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

View file

@ -6,7 +6,7 @@
{% endblock %}
{% block modal-form-open %}
<form name="reading-progress" action="{% url 'reading-status-update' book.id %}" method="POST" class="submit-status">
<form name="reading-progress-{{ uuid }}" action="{% url 'reading-status-update' book.id %}" method="POST" class="submit-status">
{% csrf_token %}
<input type="hidden" name="id" value="{{ readthrough.id }}">
{% endblock %}

View file

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

View file

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

View file

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

View file

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

View file

@ -1,4 +1,4 @@
Book Id Title Sort Character Primary Author Primary Author Role Secondary Author Secondary Author Roles Publication Date Review Rating Comment Private Comment Summary Media Physical Description Weight Height Thickness Length Dimensions Page Count LCCN Acquired Date Started Date Read Barcode BCID Tags Collections Languages Original Languages LC Classification ISBN ISBNs Subjects Dewey Decimal Dewey Wording Other Call Number Copies Source Entry Date From Where OCLC Work id Lending Patron Lending Status Lending Start Lending End
5498194 Marelle 1 Cortazar, Julio Gallimard (1979), Poche 1979 chef d'oeuvre 4.5 Marelle by Julio Cortázar (1979) Broché 590 p.; 7.24 inches 1.28 pounds 7.24 inches 1.26 inches 4.96 inches 7.24 x 4.96 x 1.26 inches 590 [2007-04-16] [2007-05-08] roman, espagnol, expérimental, bohème, philosophie Your library French Spanish PQ7797 .C7145 [2070291340] 2070291340, 9782070291342 Cortâazar, Julio. Rayuela 863 Literature > Spanish And Portuguese > Spanish fiction 1 Amazon.fr [2006-08-09] 57814
5015319 Le grand incendie de Londres: Récit, avec incises et bifurcations, 1985-1987 (Fiction & Cie) 1 Roubaud, Jacques Seuil (1989), Unknown Binding 1989 5 Le grand incendie de Londres: Récit, avec incises et bifurcations, 1985-1987 (Fiction & Cie) by Jacques Roubaud (1989) Broché 411 p.; 7.72 inches 0.88 pounds 7.72 inches 1.02 inches 5.43 inches 7.72 x 5.43 x 1.02 inches 411 Your library English PQ2678 .O77 [2020104725] 2020104725, 9782020104722 Autobiographical fiction|Roubaud, Jacques > Fiction 813 American And Canadian > Fiction > Literature 1 Amazon.com [2006-07-25] 478910
5015399 Le Maître et Marguerite 1 Boulgakov, Mikhaïl Pocket (1994), Poche 1994 Le Maître et Marguerite by Mikhaïl Boulgakov (1994) Broché 579 p.; 7.09 inches 0.66 pounds 7.09 inches 1.18 inches 4.33 inches 7.09 x 4.33 x 1.18 inches 579 Your library French PG3476 .B78 [2266062328] 2266062328, 9782266062329 Allegories|Bulgakov|Good and evil > Fiction|Humanities|Jerusalem > Fiction|Jesus Christ > Fiction|Literature|Mental illness > Fiction|Moscow (Russia) > Fiction|Novel|Pilate, Pontius, 1st cent. > Fiction|Political fiction|Russia > Fiction|Russian fiction|Russian publications (Form Entry)|Soviet Union > History > 1925-1953 > Fiction|literature 891.7342 1917-1945 > 1917-1991 (USSR) > Literature > Literature of other Indo-European languages > Other Languages > Russian > Russian Fiction 1 Amazon.fr [2006-07-25] 10151
5015399 Le Maître et Marguerite 1 Boulgakov, Mikhaïl Pocket (1994), Poche 1994 Le Maître et Marguerite by Mikhaïl Boulgakov (1994) Broché 579 p.; 7.09 inches 0.66 pounds 7.09 inches 1.18 inches 4.33 inches 7.09 x 4.33 x 1.18 inches 579 Your library French PG3476 .B78 [2266062328] Allegories|Bulgakov|Good and evil > Fiction|Humanities|Jerusalem > Fiction|Jesus Christ > Fiction|Literature|Mental illness > Fiction|Moscow (Russia) > Fiction|Novel|Pilate, Pontius, 1st cent. > Fiction|Political fiction|Russia > Fiction|Russian fiction|Russian publications (Form Entry)|Soviet Union > History > 1925-1953 > Fiction|literature 891.7342 1917-1945 > 1917-1991 (USSR) > Literature > Literature of other Indo-European languages > Other Languages > Russian > Russian Fiction 1 Amazon.fr [2006-07-25] 10151

1 Book Id Title Sort Character Primary Author Primary Author Role Secondary Author Secondary Author Roles Publication Date Review Rating Comment Private Comment Summary Media Physical Description Weight Height Thickness Length Dimensions Page Count LCCN Acquired Date Started Date Read Barcode BCID Tags Collections Languages Original Languages LC Classification ISBN ISBNs Subjects Dewey Decimal Dewey Wording Other Call Number Copies Source Entry Date From Where OCLC Work id Lending Patron Lending Status Lending Start Lending End
2 5498194 Marelle 1 Cortazar, Julio Gallimard (1979), Poche 1979 chef d'oeuvre 4.5 Marelle by Julio Cortázar (1979) Broché 590 p.; 7.24 inches 1.28 pounds 7.24 inches 1.26 inches 4.96 inches 7.24 x 4.96 x 1.26 inches 590 [2007-04-16] [2007-05-08] roman, espagnol, expérimental, bohème, philosophie Your library French Spanish PQ7797 .C7145 [2070291340] 2070291340, 9782070291342 Cortâazar, Julio. Rayuela 863 Literature > Spanish And Portuguese > Spanish fiction 1 Amazon.fr [2006-08-09] 57814
3 5015319 Le grand incendie de Londres: Récit, avec incises et bifurcations, 1985-1987 (Fiction & Cie) 1 Roubaud, Jacques Seuil (1989), Unknown Binding 1989 5 Le grand incendie de Londres: Récit, avec incises et bifurcations, 1985-1987 (Fiction & Cie) by Jacques Roubaud (1989) Broché 411 p.; 7.72 inches 0.88 pounds 7.72 inches 1.02 inches 5.43 inches 7.72 x 5.43 x 1.02 inches 411 Your library English PQ2678 .O77 [2020104725] 2020104725, 9782020104722 Autobiographical fiction|Roubaud, Jacques > Fiction 813 American And Canadian > Fiction > Literature 1 Amazon.com [2006-07-25] 478910
4 5015399 Le Maître et Marguerite 1 Boulgakov, Mikhaïl Pocket (1994), Poche 1994 Le Maître et Marguerite by Mikhaïl Boulgakov (1994) Broché 579 p.; 7.09 inches 0.66 pounds 7.09 inches 1.18 inches 4.33 inches 7.09 x 4.33 x 1.18 inches 579 Your library French PG3476 .B78 [2266062328] 2266062328, 9782266062329 Allegories|Bulgakov|Good and evil > Fiction|Humanities|Jerusalem > Fiction|Jesus Christ > Fiction|Literature|Mental illness > Fiction|Moscow (Russia) > Fiction|Novel|Pilate, Pontius, 1st cent. > Fiction|Political fiction|Russia > Fiction|Russian fiction|Russian publications (Form Entry)|Soviet Union > History > 1925-1953 > Fiction|literature 891.7342 1917-1945 > 1917-1991 (USSR) > Literature > Literature of other Indo-European languages > Other Languages > Russian > Russian Fiction 1 Amazon.fr [2006-07-25] 10151

View file

@ -48,7 +48,9 @@ class OpenLibraryImport(TestCase):
self.local_user, self.csv, False, "public"
)
import_items = models.ImportItem.objects.filter(job=import_job).all()
import_items = (
models.ImportItem.objects.filter(job=import_job).order_by("index").all()
)
self.assertEqual(len(import_items), 4)
self.assertEqual(import_items[0].index, 0)
self.assertEqual(import_items[0].data["Work Id"], "OL102749W")

View file

@ -48,7 +48,9 @@ class StorygraphImport(TestCase):
self.local_user, self.csv, False, "public"
)
import_items = models.ImportItem.objects.filter(job=import_job).all()
import_items = (
models.ImportItem.objects.filter(job=import_job).order_by("index").all()
)
self.assertEqual(len(import_items), 2)
self.assertEqual(import_items[0].index, 0)
self.assertEqual(import_items[0].normalized_data["title"], "Always Coming Home")

View file

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

View file

@ -0,0 +1,101 @@
""" style fixes and lookups for templates """
from unittest.mock import patch
from django.test import TestCase
from bookwyrm import models
from bookwyrm.templatetags import bookwyrm_tags
@patch("bookwyrm.activitystreams.add_status_task.delay")
@patch("bookwyrm.activitystreams.remove_status_task.delay")
class BookWyrmTags(TestCase):
"""lotta different things here"""
def setUp(self):
"""create some filler objects"""
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.user = models.User.objects.create_user(
"mouse@example.com",
"mouse@mouse.mouse",
"mouseword",
local=True,
localname="mouse",
)
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
"rat@rat.rat",
"ratword",
remote_id="http://example.com/rat",
local=False,
)
self.book = models.Edition.objects.create(title="Test Book")
def test_get_user_rating(self, *_):
"""get a user's most recent rating of a book"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.Review.objects.create(user=self.user, book=self.book, rating=3)
self.assertEqual(bookwyrm_tags.get_user_rating(self.book, self.user), 3)
def test_get_user_rating_doesnt_exist(self, *_):
"""there is no rating available"""
self.assertEqual(bookwyrm_tags.get_user_rating(self.book, self.user), 0)
def test_get_book_description(self, *_):
"""grab it from the edition or the parent"""
work = models.Work.objects.create(title="Test Work")
self.book.parent_work = work
self.book.save()
self.assertIsNone(bookwyrm_tags.get_book_description(self.book))
work.description = "hi"
work.save()
self.assertEqual(bookwyrm_tags.get_book_description(self.book), "hi")
self.book.description = "hello"
self.book.save()
self.assertEqual(bookwyrm_tags.get_book_description(self.book), "hello")
def test_get_next_shelf(self, *_):
"""self progress helper"""
self.assertEqual(bookwyrm_tags.get_next_shelf("to-read"), "reading")
self.assertEqual(bookwyrm_tags.get_next_shelf("reading"), "read")
self.assertEqual(bookwyrm_tags.get_next_shelf("read"), "complete")
self.assertEqual(bookwyrm_tags.get_next_shelf("blooooga"), "to-read")
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
def test_load_subclass(self, *_):
"""get a status' real type"""
review = models.Review.objects.create(user=self.user, book=self.book, rating=3)
status = models.Status.objects.get(id=review.id)
self.assertIsInstance(status, models.Status)
self.assertIsInstance(bookwyrm_tags.load_subclass(status), models.Review)
quote = models.Quotation.objects.create(
user=self.user, book=self.book, content="hi"
)
status = models.Status.objects.get(id=quote.id)
self.assertIsInstance(status, models.Status)
self.assertIsInstance(bookwyrm_tags.load_subclass(status), models.Quotation)
comment = models.Comment.objects.create(
user=self.user, book=self.book, content="hi"
)
status = models.Status.objects.get(id=comment.id)
self.assertIsInstance(status, models.Status)
self.assertIsInstance(bookwyrm_tags.load_subclass(status), models.Comment)
def test_related_status(self, *_):
"""gets the subclass model for a notification status"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
status = models.Status.objects.create(content="hi", user=self.user)
notification = models.Notification.objects.create(
user=self.user, notification_type="MENTION", related_status=status
)
result = bookwyrm_tags.related_status(notification)
self.assertIsInstance(result, models.Status)

View file

@ -0,0 +1,53 @@
""" style fixes and lookups for templates """
from unittest.mock import patch
from django.test import TestCase
from bookwyrm import models
from bookwyrm.templatetags import interaction
@patch("bookwyrm.activitystreams.add_status_task.delay")
@patch("bookwyrm.activitystreams.remove_status_task.delay")
class InteractionTags(TestCase):
"""lotta different things here"""
def setUp(self):
"""create some filler objects"""
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.user = models.User.objects.create_user(
"mouse@example.com",
"mouse@mouse.mouse",
"mouseword",
local=True,
localname="mouse",
)
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
"rat@rat.rat",
"ratword",
remote_id="http://example.com/rat",
local=False,
)
self.book = models.Edition.objects.create(title="Test Book")
def test_get_user_liked(self, *_):
"""did a user like a status"""
status = models.Review.objects.create(user=self.remote_user, book=self.book)
self.assertFalse(interaction.get_user_liked(self.user, status))
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.Favorite.objects.create(user=self.user, status=status)
self.assertTrue(interaction.get_user_liked(self.user, status))
def test_get_user_boosted(self, *_):
"""did a user boost a status"""
status = models.Review.objects.create(user=self.remote_user, book=self.book)
self.assertFalse(interaction.get_user_boosted(self.user, status))
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.Boost.objects.create(user=self.user, boosted_status=status)
self.assertTrue(interaction.get_user_boosted(self.user, status))

View file

@ -0,0 +1,15 @@
""" style fixes and lookups for templates """
from django.test import TestCase
from bookwyrm.templatetags import markdown
class MarkdownTags(TestCase):
"""lotta different things here"""
def test_get_markdown(self):
"""mardown format data"""
result = markdown.get_markdown("_hi_")
self.assertEqual(result, "<p><em>hi</em></p>")
result = markdown.get_markdown("<marquee>_hi_</marquee>")
self.assertEqual(result, "<p><em>hi</em></p>")

View file

@ -0,0 +1,90 @@
""" style fixes and lookups for templates """
from unittest.mock import patch
from django.test import TestCase
from django.utils import timezone
from bookwyrm import models
from bookwyrm.templatetags import status_display
@patch("bookwyrm.activitystreams.add_status_task.delay")
@patch("bookwyrm.activitystreams.remove_status_task.delay")
class StatusDisplayTags(TestCase):
"""lotta different things here"""
def setUp(self):
"""create some filler objects"""
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.user = models.User.objects.create_user(
"mouse@example.com",
"mouse@mouse.mouse",
"mouseword",
local=True,
localname="mouse",
)
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
"rat@rat.rat",
"ratword",
remote_id="http://example.com/rat",
local=False,
)
self.book = models.Edition.objects.create(title="Test Book")
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
def test_get_replies(self, *_):
"""direct replies to a status"""
parent = models.Review.objects.create(
user=self.user, book=self.book, content="hi"
)
first_child = models.Status.objects.create(
reply_parent=parent, user=self.user, content="hi"
)
second_child = models.Status.objects.create(
reply_parent=parent, user=self.user, content="hi"
)
third_child = models.Status.objects.create(
reply_parent=parent,
user=self.user,
deleted=True,
deleted_date=timezone.now(),
)
replies = status_display.get_replies(parent)
self.assertEqual(len(replies), 2)
self.assertTrue(first_child in replies)
self.assertTrue(second_child in replies)
self.assertFalse(third_child in replies)
def test_get_parent(self, *_):
"""get the reply parent of a status"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
parent = models.Review.objects.create(
user=self.user, book=self.book, content="hi"
)
child = models.Status.objects.create(
reply_parent=parent, user=self.user, content="hi"
)
result = status_display.get_parent(child)
self.assertEqual(result, parent)
self.assertIsInstance(result, models.Review)
def test_get_boosted(self, *_):
"""load a boosted status"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
status = models.Review.objects.create(user=self.remote_user, book=self.book)
boost = models.Boost.objects.create(user=self.user, boosted_status=status)
boosted = status_display.get_boosted(boost)
self.assertIsInstance(boosted, models.Review)
self.assertEqual(boosted, status)
def test_get_mentions(self, *_):
"""list of people mentioned"""
status = models.Status.objects.create(content="hi", user=self.remote_user)
result = status_display.get_mentions(status, self.user)
self.assertEqual(result, "@rat@example.com ")

View file

@ -0,0 +1,59 @@
""" style fixes and lookups for templates """
import re
from unittest.mock import patch
from django.test import TestCase
from bookwyrm import models
from bookwyrm.templatetags import utilities
@patch("bookwyrm.activitystreams.add_status_task.delay")
@patch("bookwyrm.activitystreams.remove_status_task.delay")
class UtilitiesTags(TestCase):
"""lotta different things here"""
def setUp(self):
"""create some filler objects"""
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.user = models.User.objects.create_user(
"mouse@example.com",
"mouse@mouse.mouse",
"mouseword",
local=True,
localname="mouse",
)
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
"rat@rat.rat",
"ratword",
remote_id="http://example.com/rat",
local=False,
)
self.book = models.Edition.objects.create(title="Test Book")
def test_get_user_identifer_local(self, *_):
"""fall back to the simplest uid available"""
self.assertNotEqual(self.user.username, self.user.localname)
self.assertEqual(utilities.get_user_identifier(self.user), "mouse")
def test_get_user_identifer_remote(self, *_):
"""for a remote user, should be their full username"""
self.assertEqual(
utilities.get_user_identifier(self.remote_user), "rat@example.com"
)
def test_get_uuid(self, *_):
"""uuid functionality"""
uuid = utilities.get_uuid("hi")
self.assertTrue(re.match(r"hi[A-Za-z0-9\-]", uuid))
def test_get_title(self, *_):
"""the title of a book"""
self.assertEqual(utilities.get_title(None), "")
self.assertEqual(utilities.get_title(self.book), "Test Book")
book = models.Edition.objects.create(title="Oh", subtitle="oh my")
self.assertEqual(utilities.get_title(book), "Oh: oh my")

View file

@ -1,190 +0,0 @@
""" style fixes and lookups for templates """
import re
from unittest.mock import patch
from django.test import TestCase
from django.utils import timezone
from bookwyrm import models
from bookwyrm.templatetags import (
bookwyrm_tags,
interaction,
markdown,
status_display,
utilities,
)
@patch("bookwyrm.activitystreams.add_status_task.delay")
@patch("bookwyrm.activitystreams.remove_status_task.delay")
class TemplateTags(TestCase):
"""lotta different things here"""
def setUp(self):
"""create some filler objects"""
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.user = models.User.objects.create_user(
"mouse@example.com",
"mouse@mouse.mouse",
"mouseword",
local=True,
localname="mouse",
)
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
"rat@rat.rat",
"ratword",
remote_id="http://example.com/rat",
local=False,
)
self.book = models.Edition.objects.create(title="Test Book")
def test_get_uuid(self, *_):
"""uuid functionality"""
uuid = utilities.get_uuid("hi")
self.assertTrue(re.match(r"hi[A-Za-z0-9\-]", uuid))
def test_get_title(self, *_):
"""the title of a book"""
self.assertEqual(utilities.get_title(None), "")
self.assertEqual(utilities.get_title(self.book), "Test Book")
book = models.Edition.objects.create(title="Oh", subtitle="oh my")
self.assertEqual(utilities.get_title(book), "Oh: oh my")
def test_get_user_rating(self, *_):
"""get a user's most recent rating of a book"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.Review.objects.create(user=self.user, book=self.book, rating=3)
self.assertEqual(bookwyrm_tags.get_user_rating(self.book, self.user), 3)
def test_get_user_rating_doesnt_exist(self, *_):
"""there is no rating available"""
self.assertEqual(bookwyrm_tags.get_user_rating(self.book, self.user), 0)
def test_get_user_identifer_local(self, *_):
"""fall back to the simplest uid available"""
self.assertNotEqual(self.user.username, self.user.localname)
self.assertEqual(utilities.get_user_identifier(self.user), "mouse")
def test_get_user_identifer_remote(self, *_):
"""for a remote user, should be their full username"""
self.assertEqual(
utilities.get_user_identifier(self.remote_user), "rat@example.com"
)
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
def test_get_replies(self, *_):
"""direct replies to a status"""
parent = models.Review.objects.create(
user=self.user, book=self.book, content="hi"
)
first_child = models.Status.objects.create(
reply_parent=parent, user=self.user, content="hi"
)
second_child = models.Status.objects.create(
reply_parent=parent, user=self.user, content="hi"
)
third_child = models.Status.objects.create(
reply_parent=parent,
user=self.user,
deleted=True,
deleted_date=timezone.now(),
)
replies = status_display.get_replies(parent)
self.assertEqual(len(replies), 2)
self.assertTrue(first_child in replies)
self.assertTrue(second_child in replies)
self.assertFalse(third_child in replies)
def test_get_parent(self, *_):
"""get the reply parent of a status"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
parent = models.Review.objects.create(
user=self.user, book=self.book, content="hi"
)
child = models.Status.objects.create(
reply_parent=parent, user=self.user, content="hi"
)
result = status_display.get_parent(child)
self.assertEqual(result, parent)
self.assertIsInstance(result, models.Review)
def test_get_user_liked(self, *_):
"""did a user like a status"""
status = models.Review.objects.create(user=self.remote_user, book=self.book)
self.assertFalse(interaction.get_user_liked(self.user, status))
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.Favorite.objects.create(user=self.user, status=status)
self.assertTrue(interaction.get_user_liked(self.user, status))
def test_get_user_boosted(self, *_):
"""did a user boost a status"""
status = models.Review.objects.create(user=self.remote_user, book=self.book)
self.assertFalse(interaction.get_user_boosted(self.user, status))
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
models.Boost.objects.create(user=self.user, boosted_status=status)
self.assertTrue(interaction.get_user_boosted(self.user, status))
def test_get_boosted(self, *_):
"""load a boosted status"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
status = models.Review.objects.create(user=self.remote_user, book=self.book)
boost = models.Boost.objects.create(user=self.user, boosted_status=status)
boosted = status_display.get_boosted(boost)
self.assertIsInstance(boosted, models.Review)
self.assertEqual(boosted, status)
def test_get_book_description(self, *_):
"""grab it from the edition or the parent"""
work = models.Work.objects.create(title="Test Work")
self.book.parent_work = work
self.book.save()
self.assertIsNone(bookwyrm_tags.get_book_description(self.book))
work.description = "hi"
work.save()
self.assertEqual(bookwyrm_tags.get_book_description(self.book), "hi")
self.book.description = "hello"
self.book.save()
self.assertEqual(bookwyrm_tags.get_book_description(self.book), "hello")
def test_get_markdown(self, *_):
"""mardown format data"""
result = markdown.get_markdown("_hi_")
self.assertEqual(result, "<p><em>hi</em></p>")
result = markdown.get_markdown("<marquee>_hi_</marquee>")
self.assertEqual(result, "<p><em>hi</em></p>")
def test_get_mentions(self, *_):
"""list of people mentioned"""
status = models.Status.objects.create(content="hi", user=self.remote_user)
result = status_display.get_mentions(status, self.user)
self.assertEqual(result, "@rat@example.com ")
def test_related_status(self, *_):
"""gets the subclass model for a notification status"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
status = models.Status.objects.create(content="hi", user=self.user)
notification = models.Notification.objects.create(
user=self.user, notification_type="MENTION", related_status=status
)
result = bookwyrm_tags.related_status(notification)
self.assertIsInstance(result, models.Status)
def test_get_next_shelf(self, *_):
"""self progress helper"""
self.assertEqual(bookwyrm_tags.get_next_shelf("to-read"), "reading")
self.assertEqual(bookwyrm_tags.get_next_shelf("reading"), "read")
self.assertEqual(bookwyrm_tags.get_next_shelf("read"), "complete")
self.assertEqual(bookwyrm_tags.get_next_shelf("blooooga"), "to-read")

View file

@ -15,7 +15,11 @@ def validate_html(html):
errors = "\n".join(
e
for e in errors.split("\n")
if "&book" not in e and "id and name attribute" not in e
if "&book" not in e
and "&type" not in e
and "id and name attribute" not in e
and "illegal characters found in URI" not in e
and "escaping malformed URI reference" not in e
)
if errors:
raise Exception(errors)

View file

@ -5,6 +5,7 @@ from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import forms, models, views
from bookwyrm.tests.validate_html import validate_html
class AnnouncementViews(TestCase):
@ -38,7 +39,7 @@ class AnnouncementViews(TestCase):
result = view(request)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_announcements_page_empty(self):
@ -51,7 +52,7 @@ class AnnouncementViews(TestCase):
result = view(request)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_announcement_page(self):
@ -68,7 +69,7 @@ class AnnouncementViews(TestCase):
result = view(request, announcement.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_create_announcement(self):
@ -138,5 +139,5 @@ class AnnouncementViews(TestCase):
result = view(request, self.local_user.localname)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)

View file

@ -61,6 +61,18 @@ class ShelfViews(TestCase):
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()
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 = True
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_anonymous(self, *_):
"""there are so many views, this just makes sure it LOADS"""
view = views.Shelf.as_view()

View file

@ -0,0 +1,142 @@
"""testing the annual summary page"""
from datetime import datetime
from unittest.mock import patch
import pytz
from django.contrib.auth.models import AnonymousUser
from django.http import Http404
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import models, views
from bookwyrm.tests.validate_html import validate_html
def make_date(*args):
"""helper function to easily generate a date obj"""
return datetime(*args, tzinfo=pytz.UTC)
class AnnualSummary(TestCase):
"""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"
):
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",
summary_keys={"2020": "0123456789"},
)
self.work = models.Work.objects.create(title="Test Work")
self.book = models.Edition.objects.create(
title="Example Edition",
remote_id="https://example.com/book/1",
parent_work=self.work,
pages=300,
)
self.anonymous_user = AnonymousUser
self.anonymous_user.is_authenticated = False
self.year = "2020"
models.SiteSettings.objects.create()
def test_annual_summary_not_authenticated(self, *_):
"""there are so many views, this just makes sure it DOESNT LOAD"""
view = views.AnnualSummary.as_view()
request = self.factory.get("")
request.user = self.anonymous_user
with self.assertRaises(Http404):
view(request, self.local_user.localname, self.year)
def test_annual_summary_not_authenticated_with_key(self, *_):
"""there are so many views, this just makes sure it DOES LOAD"""
key = self.local_user.summary_keys[self.year]
view = views.AnnualSummary.as_view()
request_url = (
f"user/{self.local_user.localname}/{self.year}-in-the-books?key={key}"
)
request = self.factory.get(request_url)
request.user = self.anonymous_user
result = view(request, self.local_user.localname, self.year)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_annual_summary_wrong_year(self, *_):
"""there are so many views, this just makes sure it DOESNT LOAD"""
view = views.AnnualSummary.as_view()
request = self.factory.get("")
request.user = self.anonymous_user
with self.assertRaises(Http404):
view(request, self.local_user.localname, self.year)
def test_annual_summary_empty_page(self, *_):
"""there are so many views, this just makes sure it LOADS"""
view = views.AnnualSummary.as_view()
request = self.factory.get("")
request.user = self.local_user
result = view(request, self.local_user.localname, self.year)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
@patch("bookwyrm.activitystreams.add_book_statuses_task.delay")
def test_annual_summary_page(self, *_):
"""there are so many views, this just makes sure it LOADS"""
models.ReadThrough.objects.create(
user=self.local_user, book=self.book, finish_date=make_date(2020, 1, 1)
)
view = views.AnnualSummary.as_view()
request = self.factory.get("")
request.user = self.local_user
result = view(request, self.local_user.localname, self.year)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
@patch("bookwyrm.activitystreams.add_book_statuses_task.delay")
def test_annual_summary_page_with_review(self, *_):
"""there are so many views, this just makes sure it LOADS"""
models.Review.objects.create(
name="Review name",
content="test content",
rating=3.0,
user=self.local_user,
book=self.book,
)
models.ReadThrough.objects.create(
user=self.local_user, book=self.book, finish_date=make_date(2020, 1, 1)
)
view = views.AnnualSummary.as_view()
request = self.factory.get("")
request.user = self.local_user
result = view(request, self.local_user.localname, self.year)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)

View file

@ -4,8 +4,7 @@ from django.contrib.auth.models import AnonymousUser
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import models
from bookwyrm import views
from bookwyrm import models, views
from bookwyrm.tests.validate_html import validate_html

View file

@ -12,6 +12,7 @@ from django.test.client import RequestFactory
from bookwyrm import forms, models, views
from bookwyrm.activitypub import ActivitypubResponse
from bookwyrm.tests.validate_html import validate_html
@patch("bookwyrm.activitystreams.ActivityStream.get_activity_stream")
@ -36,6 +37,13 @@ class FeedViews(TestCase):
local=True,
localname="mouse",
)
self.another_user = models.User.objects.create_user(
"nutria@local.com",
"nutria@nutria.nutria",
"password",
local=True,
localname="nutria",
)
self.book = models.Edition.objects.create(
parent_work=models.Work.objects.create(title="hi"),
title="Example Edition",
@ -51,7 +59,7 @@ class FeedViews(TestCase):
request.user = self.local_user
result = view(request, "home")
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
@patch("bookwyrm.suggested_users.SuggestedUsers.get_suggestions")
@ -84,7 +92,7 @@ class FeedViews(TestCase):
is_api.return_value = False
result = view(request, "mouse", status.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
with patch("bookwyrm.views.feed.is_api_request") as is_api:
@ -151,7 +159,7 @@ class FeedViews(TestCase):
is_api.return_value = False
result = view(request, "mouse", status.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
with patch("bookwyrm.views.feed.is_api_request") as is_api:
@ -171,7 +179,7 @@ class FeedViews(TestCase):
is_api.return_value = False
result = view(request, "mouse", status.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
with patch("bookwyrm.views.feed.is_api_request") as is_api:
@ -187,9 +195,20 @@ class FeedViews(TestCase):
request.user = self.local_user
result = view(request)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_direct_messages_page_user(self, *_):
"""there are so many views, this just makes sure it LOADS"""
view = views.DirectMessage.as_view()
request = self.factory.get("")
request.user = self.local_user
result = view(request, "nutria")
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
self.assertEqual(result.context_data["partner"], self.another_user)
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
@patch("bookwyrm.activitystreams.add_book_statuses_task.delay")
def test_get_suggested_book(self, *_):

View file

@ -5,6 +5,7 @@ from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import forms, models, views
from bookwyrm.tests.validate_html import validate_html
@patch("bookwyrm.activitystreams.populate_stream_task.delay")
@ -40,7 +41,7 @@ class GetStartedViews(TestCase):
result = view(request)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
@ -72,7 +73,7 @@ class GetStartedViews(TestCase):
result = view(request)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_books_view_with_query(self, _):
@ -84,7 +85,7 @@ class GetStartedViews(TestCase):
result = view(request)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
@ -117,7 +118,7 @@ class GetStartedViews(TestCase):
result = view(request)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
@patch("bookwyrm.suggested_users.SuggestedUsers.get_suggestions")
@ -130,5 +131,5 @@ class GetStartedViews(TestCase):
result = view(request)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)

View file

@ -1,6 +1,8 @@
""" test for app action functionality """
from unittest.mock import patch
from django.contrib.auth.models import AnonymousUser
from django.http import Http404
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
@ -43,6 +45,8 @@ class GroupViews(TestCase):
self.membership = models.GroupMember.objects.create(
group=self.testgroup, user=self.local_user
)
self.anonymous_user = AnonymousUser
self.anonymous_user.is_authenticated = False
models.SiteSettings.objects.create()
@ -56,6 +60,17 @@ class GroupViews(TestCase):
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_group_get_anonymous(self, _):
"""there are so many views, this just makes sure it LOADS"""
self.testgroup.privacy = "followers"
self.testgroup.save()
view = views.Group.as_view()
request = self.factory.get("")
request.user = self.anonymous_user
with self.assertRaises(Http404):
view(request, group_id=self.testgroup.id)
def test_usergroups_get(self, _):
"""there are so many views, this just makes sure it LOADS"""
view = views.UserGroups.as_view()

View file

@ -10,6 +10,7 @@ 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):
@ -87,14 +88,14 @@ class ListViews(TestCase):
result = view(request)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request.user = self.anonymous_user
result = view(request)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_saved_lists_page(self):
@ -113,7 +114,7 @@ class ListViews(TestCase):
result = view(request)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
self.assertEqual(result.context_data["lists"].object_list, [booklist])
@ -130,7 +131,7 @@ class ListViews(TestCase):
result = view(request)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
self.assertEqual(len(result.context_data["lists"].object_list), 0)
@ -191,7 +192,7 @@ class ListViews(TestCase):
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_list_page_sorted(self):
@ -213,7 +214,7 @@ class ListViews(TestCase):
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request = self.factory.get("/?sort_by=title")
@ -222,7 +223,7 @@ class ListViews(TestCase):
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request = self.factory.get("/?sort_by=rating")
@ -231,7 +232,7 @@ class ListViews(TestCase):
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request = self.factory.get("/?sort_by=sdkfh")
@ -240,7 +241,7 @@ class ListViews(TestCase):
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_list_page_empty(self):
@ -253,7 +254,7 @@ class ListViews(TestCase):
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_list_page_logged_out(self):
@ -274,7 +275,7 @@ class ListViews(TestCase):
is_api.return_value = False
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_list_page_json_view(self):
@ -361,7 +362,7 @@ class ListViews(TestCase):
result = view(request, self.list.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
request.user = self.anonymous_user
@ -381,7 +382,7 @@ class ListViews(TestCase):
result = view(request, self.local_user.localname)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_user_lists_page_logged_out(self):
@ -433,5 +434,5 @@ class ListViews(TestCase):
result = view(request, self.list.id, embed_key)
self.assertIsInstance(result, TemplateResponse)
result.render()
validate_html(result.render())
self.assertEqual(result.status_code, 200)

View file

@ -12,6 +12,7 @@ import responses
from bookwyrm import models, views
from bookwyrm.settings import DOMAIN
from bookwyrm.tests.validate_html import validate_html
class Views(TestCase):
@ -62,7 +63,7 @@ class Views(TestCase):
is_api.return_value = False
response = view(request)
self.assertIsInstance(response, TemplateResponse)
response.render()
validate_html(response.render())
@responses.activate
def test_search_books(self):
@ -89,7 +90,7 @@ class Views(TestCase):
is_api.return_value = False
response = view(request)
self.assertIsInstance(response, TemplateResponse)
response.render()
validate_html(response.render())
connector_results = response.context_data["results"]
self.assertEqual(len(connector_results), 2)
self.assertEqual(connector_results[0]["results"][0].title, "Test Book")
@ -107,7 +108,7 @@ class Views(TestCase):
is_api.return_value = False
response = view(request)
self.assertIsInstance(response, TemplateResponse)
response.render()
validate_html(response.render())
connector_results = response.context_data["results"]
self.assertEqual(len(connector_results), 1)
self.assertEqual(connector_results[0]["results"][0].title, "Test Book")
@ -120,7 +121,7 @@ class Views(TestCase):
response = view(request)
self.assertIsInstance(response, TemplateResponse)
response.render()
validate_html(response.render())
self.assertEqual(response.context_data["results"][0], self.local_user)
def test_search_users_logged_out(self):
@ -134,7 +135,7 @@ class Views(TestCase):
response = view(request)
response.render()
validate_html(response.render())
self.assertFalse("results" in response.context_data)
def test_search_lists(self):
@ -149,5 +150,5 @@ class Views(TestCase):
response = view(request)
self.assertIsInstance(response, TemplateResponse)
response.render()
validate_html(response.render())
self.assertEqual(response.context_data["results"][0], booklist)

View file

@ -80,6 +80,29 @@ class UserViews(TestCase):
self.assertIsInstance(result, ActivitypubResponse)
self.assertEqual(result.status_code, 200)
def test_user_page_domain(self):
"""when the user domain has dashes in it"""
with patch("bookwyrm.models.user.set_remote_server"):
self.remote_user = models.User.objects.create_user(
"nutria",
"",
"nutriaword",
local=False,
remote_id="https://ex--ample.co----m/users/nutria",
inbox="https://ex--ample.co----m/users/nutria/inbox",
outbox="https://ex--ample.co----m/users/nutria/outbox",
)
view = views.User.as_view()
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.views.user.is_api_request") as is_api:
is_api.return_value = False
result = view(request, "nutria@ex--ample.co----m")
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
def test_user_page_blocked(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.User.as_view()
@ -186,3 +209,11 @@ class UserViews(TestCase):
self.local_user.refresh_from_db()
self.assertFalse(self.local_user.show_suggested_users)
def test_user_redirect(self):
"""test the basic redirect"""
request = self.factory.get("@mouse")
request.user = self.anonymous_user
result = views.user_redirect(request, "mouse")
self.assertEqual(result.status_code, 302)

View file

@ -50,7 +50,7 @@ urlpatterns = [
re_path("^api/updates/stream/(?P<stream>[a-z]+)/?$", views.get_unread_status_count),
# authentication
re_path(r"^login/?$", views.Login.as_view(), name="login"),
re_path(r"^login/(?P<confirmed>confirmed)?$", views.Login.as_view(), name="login"),
re_path(r"^login/(?P<confirmed>confirmed)/?$", views.Login.as_view(), name="login"),
re_path(r"^register/?$", views.Register.as_view()),
re_path(r"confirm-email/?$", views.ConfirmEmail.as_view(), name="confirm-email"),
re_path(
@ -112,12 +112,12 @@ urlpatterns = [
name="settings-federated-server",
),
re_path(
r"^settings/federation/(?P<server>\d+)/block?$",
r"^settings/federation/(?P<server>\d+)/block/?$",
views.block_server,
name="settings-federated-server-block",
),
re_path(
r"^settings/federation/(?P<server>\d+)/unblock?$",
r"^settings/federation/(?P<server>\d+)/unblock/?$",
views.unblock_server,
name="settings-federated-server-unblock",
),
@ -140,7 +140,7 @@ urlpatterns = [
name="settings-invite-requests",
),
re_path(
r"^settings/requests/ignore?$",
r"^settings/requests/ignore/?$",
views.ignore_invite_request,
name="settings-invite-requests-ignore",
),
@ -229,7 +229,7 @@ urlpatterns = [
r"^direct-messages/?$", views.DirectMessage.as_view(), name="direct-messages"
),
re_path(
rf"^direct-messages/(?P<username>{regex.USERNAME})?$",
rf"^direct-messages/(?P<username>{regex.USERNAME})/?$",
views.DirectMessage.as_view(),
name="direct-messages-user",
),
@ -276,6 +276,7 @@ urlpatterns = [
# users
re_path(rf"{USER_PATH}\.json$", views.User.as_view()),
re_path(rf"{USER_PATH}/?$", views.User.as_view(), name="user-feed"),
re_path(rf"^@(?P<username>{regex.USERNAME})$", views.user_redirect),
re_path(rf"{USER_PATH}/rss/?$", views.rss_feed.RssFeed(), name="user-rss"),
re_path(
rf"{USER_PATH}/followers(.json)?/?$",
@ -338,7 +339,7 @@ urlpatterns = [
re_path(r"^save-list/(?P<list_id>\d+)/?$", views.save_list, name="list-save"),
re_path(r"^unsave-list/(?P<list_id>\d+)/?$", views.unsave_list, name="list-unsave"),
re_path(
r"^list/(?P<list_id>\d+)/embed/(?P<list_key>[0-9a-f]+)?$",
r"^list/(?P<list_id>\d+)/embed/(?P<list_key>[0-9a-f]+)/?$",
views.unsafe_embed_list,
name="embed-list",
),
@ -355,7 +356,7 @@ urlpatterns = [
name="shelf",
),
re_path(r"^create-shelf/?$", views.create_shelf, name="shelf-create"),
re_path(r"^delete-shelf/(?P<shelf_id>\d+)?$", views.delete_shelf),
re_path(r"^delete-shelf/(?P<shelf_id>\d+)/?$", views.delete_shelf),
re_path(r"^shelve/?$", views.shelve),
re_path(r"^unshelve/?$", views.unshelve),
# goals
@ -422,7 +423,7 @@ urlpatterns = [
re_path(rf"{BOOK_PATH}/edit/?$", views.EditBook.as_view(), name="edit-book"),
re_path(rf"{BOOK_PATH}/confirm/?$", views.ConfirmEditBook.as_view()),
re_path(r"^create-book/?$", views.EditBook.as_view(), name="create-book"),
re_path(r"^create-book/confirm?$", views.ConfirmEditBook.as_view()),
re_path(r"^create-book/confirm/?$", views.ConfirmEditBook.as_view()),
re_path(rf"{BOOK_PATH}/editions(.json)?/?$", views.Editions.as_view()),
re_path(
r"^upload-cover/(?P<book_id>\d+)/?$", views.upload_cover, name="upload-cover"
@ -477,4 +478,18 @@ urlpatterns = [
re_path(
r"^ostatus_success/?$", views.ostatus_follow_success, name="ostatus-success"
),
# annual summary
re_path(
r"^my-year-in-the-books/(?P<year>\d+)/?$",
views.personal_annual_summary,
),
re_path(
rf"{LOCAL_USER_PATH}/(?P<year>\d+)-in-the-books/?$",
views.AnnualSummary.as_view(),
name="annual-summary",
),
re_path(r"^summary_add_key/?$", views.summary_add_key, name="summary-add-key"),
re_path(
r"^summary_revoke_key/?$", views.summary_revoke_key, name="summary-revoke-key"
),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View file

@ -1,6 +1,6 @@
""" defining regexes for regularly used concepts """
DOMAIN = r"[\w_\-\.]+\.[a-z]{2,}"
DOMAIN = r"[\w_\-\.]+\.[a-z\-]{2,}"
LOCALNAME = r"@?[a-zA-Z_\-\.0-9]+"
STRICT_LOCALNAME = r"@[a-zA-Z_\-\.0-9]+"
USERNAME = rf"{LOCALNAME}(@{DOMAIN})?"

View file

@ -94,5 +94,11 @@ 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 .user import User, Followers, Following, hide_suggestions
from .user import User, Followers, Following, hide_suggestions, user_redirect
from .wellknown import *
from .annual_summary import (
AnnualSummary,
personal_annual_summary,
summary_add_key,
summary_revoke_key,
)

View file

@ -0,0 +1,210 @@
"""end-of-year read books stats"""
from datetime import date
from uuid import uuid4
from django.contrib.auth.decorators import login_required
from django.db.models import Avg, Sum, Min, Case, When
from django.http import Http404
from django.shortcuts import redirect
from django.template.response import TemplateResponse
from django.views import View
from django.views.decorators.http import require_POST
from bookwyrm import models
from .helpers import get_user_from_username
# December day of first availability
FIRST_DAY = 15
# January day of last availability, 0 for no availability in Jan.
LAST_DAY = 15
# pylint: disable= no-self-use
class AnnualSummary(View):
"""display a summary of the year for the current user"""
def get(self, request, username, year):
"""get response"""
user = get_user_from_username(request.user, username)
year_key = None
if user.summary_keys and year in user.summary_keys:
year_key = user.summary_keys[year]
privacy_verification(request, user, year, year_key)
paginated_years = (
int(year) - 1 if is_year_available(user, int(year) - 1) else None,
int(year) + 1 if is_year_available(user, int(year) + 1) else None,
)
# get data
read_book_ids_in_year = (
user.readthrough_set.filter(
finish_date__year__gte=year,
finish_date__year__lt=int(year) + 1,
)
.order_by("finish_date")
.values_list("book__id", flat=True)
)
if len(read_book_ids_in_year) == 0:
data = {
"summary_user": user,
"year": year,
"year_key": year_key,
"book_total": 0,
"books": [],
"paginated_years": paginated_years,
}
return TemplateResponse(request, "annual_summary/layout.html", data)
read_books_in_year = get_books_from_shelfbooks(read_book_ids_in_year)
# pages stats queries
page_stats = read_books_in_year.aggregate(Sum("pages"), Avg("pages"))
book_list_by_pages = read_books_in_year.filter(pages__gte=0).order_by("pages")
# books with no pages
no_page_list = len(read_books_in_year.filter(pages__exact=None))
# rating stats queries
ratings = (
models.Review.objects.filter(user=user)
.exclude(deleted=True)
.exclude(rating=None)
.filter(book_id__in=read_book_ids_in_year)
)
ratings_stats = ratings.aggregate(Avg("rating"))
data = {
"summary_user": user,
"year": year,
"year_key": year_key,
"books_total": len(read_books_in_year),
"books": read_books_in_year,
"pages_total": page_stats["pages__sum"] or 0,
"pages_average": round(
page_stats["pages__avg"] if page_stats["pages__avg"] else 0
),
"book_pages_lowest": book_list_by_pages.first(),
"book_pages_highest": book_list_by_pages.last(),
"no_page_number": no_page_list,
"ratings_total": len(ratings),
"rating_average": round(
ratings_stats["rating__avg"] if ratings_stats["rating__avg"] else 0, 2
),
"book_rating_highest": ratings.order_by("-rating").first(),
"best_ratings_books_ids": [
review.book.id for review in ratings.filter(rating=5)
],
"paginated_years": paginated_years,
}
return TemplateResponse(request, "annual_summary/layout.html", data)
@login_required
def personal_annual_summary(request, year):
"""redirect simple URL to URL with username"""
return redirect("annual-summary", request.user.localname, year)
@login_required
@require_POST
def summary_add_key(request):
"""add summary key"""
year = request.POST["year"]
user = request.user
new_key = uuid4().hex
if not user.summary_keys:
user.summary_keys = {
year: new_key,
}
else:
user.summary_keys[year] = new_key
user.save()
response = redirect("annual-summary", user.localname, year)
response["Location"] += f"?key={str(new_key)}"
return response
@login_required
@require_POST
def summary_revoke_key(request):
"""revoke summary key"""
year = request.POST["year"]
user = request.user
if user.summary_keys and year in user.summary_keys:
user.summary_keys.pop(year)
user.save()
return redirect("annual-summary", user.localname, year)
def get_annual_summary_year():
"""return the latest available annual summary year or None"""
today = date.today()
if date(today.year, 12, FIRST_DAY) <= today <= date(today.year, 12, 31):
return today.year
if LAST_DAY > 0 and date(today.year, 1, 1) <= today <= date(
today.year, 1, LAST_DAY
):
return today.year - 1
return None
def privacy_verification(request, user, year, year_key):
"""raises a 404 error if the user should not access the page"""
if user != request.user:
request_key = None
if "key" in request.GET:
request_key = request.GET["key"]
if not request_key or request_key != year_key:
raise Http404(f"The summary for {year} is unavailable")
if not is_year_available(user, year):
raise Http404(f"The summary for {year} is unavailable")
def is_year_available(user, year):
"""return boolean"""
earliest_year = user.readthrough_set.filter(finish_date__isnull=False).aggregate(
Min("finish_date")
)["finish_date__min"]
if not earliest_year:
return True
earliest_year = earliest_year.year
today = date.today()
year = int(year)
if earliest_year <= year < today.year:
return True
if year == today.year and today >= date(today.year, 12, FIRST_DAY):
return True
return False
def get_books_from_shelfbooks(books_ids):
"""return an ordered QuerySet of books from a list"""
ordered = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(books_ids)])
books = models.Edition.objects.filter(id__in=books_ids).order_by(ordered)
return books

View file

@ -16,6 +16,7 @@ from bookwyrm.settings import PAGE_LENGTH, STREAMS
from bookwyrm.suggested_users import suggested_users
from .helpers import filter_stream_by_status_type, get_user_from_username
from .helpers import is_api_request, is_bookwyrm_request
from .annual_summary import get_annual_summary_year
# pylint: disable= no-self-use
@ -64,6 +65,7 @@ class Feed(View):
"allowed_status_types": request.user.feed_status_types,
"settings_saved": settings_saved,
"path": f"/{tab['key']}",
"annual_summary_year": get_annual_summary_year(),
},
}
return TemplateResponse(request, "feed/feed.html", data)

View file

@ -39,7 +39,8 @@ class Login(View):
return redirect("/")
login_form = forms.LoginForm(request.POST)
localname = login_form.data["localname"]
localname = login_form.data.get("localname")
if "@" in localname: # looks like an email address to me
try:
username = models.User.objects.get(email=localname).username
@ -47,7 +48,7 @@ class Login(View):
username = localname
else:
username = f"{localname}@{DOMAIN}"
password = login_form.data["password"]
password = login_form.data.get("password")
# perform authentication
user = authenticate(request, username=username, password=password)

View file

@ -52,7 +52,7 @@ class Shelf(View):
)
shelf = FakeShelf("all", _("All books"), user, books, "public")
if is_api_request(request):
if is_api_request(request) and shelf_identifier:
return ActivitypubResponse(shelf.to_activity(**request.GET))
reviews = models.Review.objects

View file

@ -151,3 +151,9 @@ def hide_suggestions(request):
request.user.show_suggested_users = False
request.user.save(broadcast=False, update_fields=["show_suggested_users"])
return redirect(request.headers.get("Referer", "/"))
# pylint: disable=unused-argument
def user_redirect(request, username):
"""redirect to a user's feed"""
return redirect("user-feed", username=username)

25
bw-dev
View file

@ -130,8 +130,11 @@ case "$CMD" in
black)
makeitblack
;;
prettier)
npx prettier --write bookwyrm/static/js/*.js
;;
populate_streams)
runweb python manage.py populate_streams $@
runweb python manage.py populate_streams "$@"
;;
populate_lists_streams)
runweb python manage.py populate_lists_streams $@
@ -143,20 +146,33 @@ case "$CMD" in
runweb python manage.py generateimages
;;
generate_preview_images)
runweb python manage.py generate_preview_images $@
runweb python manage.py generate_preview_images "$@"
;;
copy_media_to_s3)
awscommand "bookwyrm_media_volume:/images"\
"s3 cp /images s3://${AWS_STORAGE_BUCKET_NAME}/images\
--endpoint-url ${AWS_S3_ENDPOINT_URL}\
--recursive --acl public-read"
--recursive --acl public-read" "$@"
;;
sync_media_to_s3)
awscommand "bookwyrm_media_volume:/images"\
"s3 sync /images s3://${AWS_STORAGE_BUCKET_NAME}/images\
--endpoint-url ${AWS_S3_ENDPOINT_URL}\
--acl public-read" "$@"
;;
set_cors_to_s3)
set +x
config_file=$1
if [ -z "$config_file" ]; then
echo "This command requires a JSON file containing a CORS configuration as an argument"
exit 1
fi
set -x
awscommand "$(pwd):/bw"\
"s3api put-bucket-cors\
--bucket ${AWS_STORAGE_BUCKET_NAME}\
--endpoint-url ${AWS_S3_ENDPOINT_URL}\
--cors-configuration file:///bw/$@"
--cors-configuration file:///bw/$config_file" "$@"
;;
runweb)
runweb "$@"
@ -187,6 +203,7 @@ case "$CMD" in
echo " generate_thumbnails"
echo " generate_preview_images [--all]"
echo " copy_media_to_s3"
echo " sync_media_to_s3"
echo " set_cors_to_s3 [cors file]"
echo " runweb [command]"
;;

View file

@ -20,6 +20,7 @@ update_locales
build
clean
black
prettier
populate_streams
populate_suggestions
generate_thumbnails

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-08 15:40+0000\n"
"PO-Revision-Date: 2021-12-09 18:56\n"
"POT-Creation-Date: 2021-12-28 20:12+0000\n"
"PO-Revision-Date: 2021-12-28 21:17\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: German\n"
"Language: de\n"
@ -72,16 +72,16 @@ msgstr "Aufsteigend"
msgid "Descending"
msgstr "Absteigend"
#: bookwyrm/importers/importer.py:141 bookwyrm/importers/importer.py:163
#: bookwyrm/importers/importer.py:145 bookwyrm/importers/importer.py:167
msgid "Error loading book"
msgstr "Fehler beim Laden des Buches"
#: bookwyrm/importers/importer.py:150
#: bookwyrm/importers/importer.py:154
msgid "Could not find a match for book"
msgstr "Keine Übereinstimmung für das Buch gefunden"
#: bookwyrm/models/base_model.py:17
#: bookwyrm/templates/import/import_status.html:190
#: bookwyrm/templates/import/import_status.html:200
msgid "Pending"
msgstr "Ausstehend"
@ -144,7 +144,7 @@ msgstr "%(value)s ist keine gültige remote_id"
msgid "%(value)s is not a valid username"
msgstr "%(value)s ist kein gültiger Benutzer*inname"
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:173
#: bookwyrm/templates/ostatus/error.html:29
msgid "username"
msgstr "Benutzer*inname"
@ -159,11 +159,11 @@ msgstr "Besprechungen"
#: bookwyrm/models/user.py:33
msgid "Comments"
msgstr ""
msgstr "Kommentare"
#: bookwyrm/models/user.py:34
msgid "Quotations"
msgstr ""
msgstr "Zitate"
#: bookwyrm/models/user.py:35
msgid "Everything else"
@ -243,6 +243,136 @@ msgstr "Serverfehler"
msgid "Something went wrong! Sorry about that."
msgstr "Etwas ist schief gelaufen! Tut uns leid."
#: bookwyrm/templates/annual_summary/layout.html:7
#: bookwyrm/templates/feed/summary_card.html:8
#, python-format
msgid "%(year)s in the books"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:43
#, python-format
msgid "%(year)s <em>in the books</em>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:47
#, python-format
msgid "<em>%(display_name)ss</em> year of reading"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:53
msgid "Share this page"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: <strong>public with key</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:78
msgid "The page can be seen by anyone with the complete address."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: <strong>private</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:99
msgid "When you make your page private, the old key wont give access to the page anymore. A new key will be created if the page is once again made public."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didnt finish any book in %(year)s"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
msgid "In %(year)s, %(display_name)s read %(books_total)s book<br />for a total of %(pages_total)s pages!"
msgid_plural "In %(year)s, %(display_name)s read %(books_total)s books<br />for a total of %(pages_total)s pages!"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/annual_summary/layout.html:124
msgid "Thats great!"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesnt have pages)"
msgid_plural "(%(no_page_number)s books dont have pages)"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:155
#: bookwyrm/templates/annual_summary/layout.html:176
#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "von"
#: bookwyrm/templates/annual_summary/layout.html:161
#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "<strong>%(pages)s</strong> pages"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
msgid "%(display_name)s left %(ratings_total)s rating, <br />their average rating is %(rating_average)s"
msgid_plural "%(display_name)s left %(ratings_total)s ratings, <br />their average rating is %(rating_average)s"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: <strong>%(rating)s</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
msgid "All the books %(display_name)s read in %(year)s"
msgstr ""
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
@ -431,13 +561,6 @@ msgstr ""
msgid "Confirm"
msgstr "Bestätigen"
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "von"
#: bookwyrm/templates/book/book.html:55 bookwyrm/templates/book/book.html:56
msgid "Edit Book"
msgstr "Buch bearbeiten"
@ -518,7 +641,7 @@ msgstr "Themen"
msgid "Places"
msgstr "Orte"
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:75
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:77
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -671,7 +794,7 @@ msgstr "Autor*innen hinzufügen:"
#: bookwyrm/templates/book/edit/edit_book_form.html:145
#: bookwyrm/templates/book/edit/edit_book_form.html:148
msgid "Add Author"
msgstr ""
msgstr "Autor*in hinzufügen"
#: bookwyrm/templates/book/edit/edit_book_form.html:146
#: bookwyrm/templates/book/edit/edit_book_form.html:149
@ -893,7 +1016,7 @@ msgstr "Föderierte Gemeinschaft"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
#: bookwyrm/templates/layout.html:101
#: bookwyrm/templates/layout.html:103
msgid "Directory"
msgstr "Verzeichnis"
@ -913,6 +1036,8 @@ msgstr "Du kannst dich jederzeit in deinen <a href=\"%(path)s\">Profileinstellun
#: bookwyrm/templates/directory/directory.html:29
#: bookwyrm/templates/directory/directory.html:31
#: bookwyrm/templates/feed/goal_card.html:17
#: bookwyrm/templates/feed/summary_card.html:12
#: bookwyrm/templates/feed/summary_card.html:14
#: bookwyrm/templates/snippets/announcement.html:34
msgid "Dismiss message"
msgstr "Nachricht schließen"
@ -1011,7 +1136,7 @@ msgstr "<a href=\"%(user_path)s\">%(username)s</a> hat <a href=\"%(book_path)s\"
#: bookwyrm/templates/discover/discover.html:4
#: bookwyrm/templates/discover/discover.html:10
#: bookwyrm/templates/layout.html:78
#: bookwyrm/templates/layout.html:80
msgid "Discover"
msgstr "Entdecken"
@ -1128,24 +1253,24 @@ msgstr "Falls du dein Passwort gar nicht zurücksetzen wolltest, kannst du diese
msgid "Reset your %(site_name)s password"
msgstr "Passwort für %(site_name)s zurücksetzen"
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:39
#, python-format
msgid "%(site_name)s home page"
msgstr ""
#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:232
#, python-format
msgid "About %(site_name)s"
msgstr "Über %(site_name)s"
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:234
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:236
msgid "Contact site admin"
msgstr "Administrator*in kontaktieren"
#: bookwyrm/templates/embed-layout.html:46
msgid "Join Bookwyrm"
msgstr ""
msgstr "Bookwyrm beitreten"
#: bookwyrm/templates/feed/direct_messages.html:8
#, python-format
@ -1153,7 +1278,7 @@ msgid "Direct Messages with <a href=\"%(path)s\">%(username)s</a>"
msgstr "Direktnachrichten mit <a href=\"%(path)s\">%(username)s</a>"
#: bookwyrm/templates/feed/direct_messages.html:10
#: bookwyrm/templates/layout.html:111
#: bookwyrm/templates/layout.html:113
msgid "Direct Messages"
msgstr "Direktnachrichten"
@ -1171,22 +1296,22 @@ msgstr ""
#: bookwyrm/templates/feed/feed.html:39
msgid "Saved!"
msgstr ""
msgstr "Gespeichert!"
#: bookwyrm/templates/feed/feed.html:53
msgid "Save settings"
msgstr ""
msgstr "Einstellungen speichern"
#: bookwyrm/templates/feed/feed.html:63
#, python-format
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr "lade <span data-poll=\"stream/%(tab_key)s\">0</span> ungelesene Statusmeldung(en)"
#: bookwyrm/templates/feed/feed.html:80
#: bookwyrm/templates/feed/feed.html:86
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "Hier sind noch keine Aktivitäten! Folge Anderen, um loszulegen"
#: bookwyrm/templates/feed/feed.html:81
#: bookwyrm/templates/feed/feed.html:87
msgid "Alternatively, you can try enabling more status types"
msgstr ""
@ -1206,7 +1331,7 @@ msgstr "Du kannst dein Leseziel jederzeit auf deiner <a href=\"%(path)s\">Profil
msgid "Updates"
msgstr "Updates"
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:108
msgid "Your Books"
msgstr "Deine Bücher"
@ -1260,6 +1385,15 @@ msgstr "Keine vorgeschlagenen Benutzer*innen anzeigen"
msgid "View directory"
msgstr "Verzeichnis anzeigen"
#: bookwyrm/templates/feed/summary_card.html:21
msgid "The end of the year is the best moment to take stock of all the books read during the last 12 months. How many pages have you read? Which book is your best-rated of the year? We compiled these stats, and more!"
msgstr ""
#: bookwyrm/templates/feed/summary_card.html:26
#, python-format
msgid "Discover your stats for %(year)s!"
msgstr ""
#: bookwyrm/templates/get_started/book_preview.html:6
#, python-format
msgid "Have you read %(book_title)s?"
@ -1267,14 +1401,14 @@ msgstr "Hast du %(book_title)s gelesen?"
#: bookwyrm/templates/get_started/book_preview.html:7
msgid "Add to your books"
msgstr ""
msgstr "Zu deinen Büchern hinzufügen"
#: bookwyrm/templates/get_started/books.html:6
msgid "What are you reading?"
msgstr "Was liest du gerade?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:138
msgid "Search for a book"
msgstr "Nach einem Buch suchen"
@ -1293,8 +1427,8 @@ msgstr "Du kannst Bücher hinzufügen, wenn du %(site_name)s benutzt."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/group.html:19
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51
#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1505,28 +1639,28 @@ msgstr "Bücher importieren"
msgid "Data source:"
msgstr "Datenquelle:"
#: bookwyrm/templates/import/import.html:37
#: bookwyrm/templates/import/import.html:40
msgid "Data file:"
msgstr "Datei:"
#: bookwyrm/templates/import/import.html:45
#: bookwyrm/templates/import/import.html:48
msgid "Include reviews"
msgstr "Besprechungen einschließen"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:53
msgid "Privacy setting for imported reviews:"
msgstr "Datenschutzeinstellung für importierte Besprechungen:"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/settings/federation/instance_blocklist.html:64
msgid "Import"
msgstr "Importieren"
#: bookwyrm/templates/import/import.html:61
#: bookwyrm/templates/import/import.html:64
msgid "Recent Imports"
msgstr "Zuletzt importiert"
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/import/import.html:66
msgid "No recent imports"
msgstr "Keine aktuellen Importe"
@ -1555,7 +1689,7 @@ msgstr ""
#: bookwyrm/templates/import/import_status.html:50
msgid "Refresh"
msgstr ""
msgstr "Aktualisieren"
#: bookwyrm/templates/import/import_status.html:71
#, python-format
@ -1592,29 +1726,33 @@ msgstr "Titel"
#: bookwyrm/templates/import/import_status.html:106
msgid "ISBN"
msgstr "ISBN"
#: bookwyrm/templates/import/import_status.html:110
msgid "Openlibrary key"
msgstr ""
#: bookwyrm/templates/import/import_status.html:109
#: bookwyrm/templates/import/import_status.html:114
#: bookwyrm/templates/shelf/shelf.html:145
#: bookwyrm/templates/shelf/shelf.html:169
msgid "Author"
msgstr "Autor*in"
#: bookwyrm/templates/import/import_status.html:112
#: bookwyrm/templates/import/import_status.html:117
msgid "Shelf"
msgstr ""
msgstr "Regal"
#: bookwyrm/templates/import/import_status.html:115
#: bookwyrm/templates/import/import_status.html:120
#: bookwyrm/templates/import/manual_review.html:13
#: bookwyrm/templates/snippets/create_status.html:17
msgid "Review"
msgstr "Besprechen"
#: bookwyrm/templates/import/import_status.html:119
#: bookwyrm/templates/import/import_status.html:124
msgid "Book"
msgstr "Buch"
#: bookwyrm/templates/import/import_status.html:122
#: bookwyrm/templates/import/import_status.html:127
#: bookwyrm/templates/settings/announcements/announcements.html:38
#: bookwyrm/templates/settings/federation/instance_list.html:46
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44
@ -1624,31 +1762,31 @@ msgstr "Buch"
msgid "Status"
msgstr "Status"
#: bookwyrm/templates/import/import_status.html:130
#: bookwyrm/templates/import/import_status.html:135
msgid "Import preview unavailable."
msgstr ""
#: bookwyrm/templates/import/import_status.html:162
#: bookwyrm/templates/import/import_status.html:172
msgid "View imported review"
msgstr ""
#: bookwyrm/templates/import/import_status.html:176
#: bookwyrm/templates/import/import_status.html:186
msgid "Imported"
msgstr "Importiert"
#: bookwyrm/templates/import/import_status.html:182
#: bookwyrm/templates/import/import_status.html:192
msgid "Needs manual review"
msgstr ""
#: bookwyrm/templates/import/import_status.html:195
#: bookwyrm/templates/import/import_status.html:205
msgid "Retry"
msgstr ""
msgstr "Erneut versuchen"
#: bookwyrm/templates/import/import_status.html:213
#: bookwyrm/templates/import/import_status.html:223
msgid "This import is in an old format that is no longer supported. If you would like to troubleshoot missing items from this import, click the button below to update the import format."
msgstr ""
#: bookwyrm/templates/import/import_status.html:215
#: bookwyrm/templates/import/import_status.html:225
msgid "Update import"
msgstr ""
@ -1769,7 +1907,7 @@ msgid "Login"
msgstr "Anmeldung"
#: bookwyrm/templates/landing/login.html:7
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:179
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:181
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr "Anmelden"
@ -1778,7 +1916,7 @@ msgstr "Anmelden"
msgid "Success! Email address confirmed."
msgstr "Alles klar! E-Mail-Adresse bestätigt."
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:172
#: bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
@ -1786,12 +1924,12 @@ msgstr "Benutzer*inname:"
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
#: bookwyrm/templates/layout.html:174 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/layout.html:176 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/snippets/register_form.html:20
msgid "Password:"
msgstr "Passwort:"
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:176
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:178
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr "Passwort vergessen?"
@ -1819,23 +1957,23 @@ msgstr "Passwort zurücksetzen"
msgid "%(site_name)s search"
msgstr "%(site_name)s-Suche"
#: bookwyrm/templates/layout.html:43
#: bookwyrm/templates/layout.html:45
msgid "Search for a book, user, or list"
msgstr "Nach einem Buch, einem*r Benutzer*in oder einer Liste suchen"
#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62
#: bookwyrm/templates/layout.html:63 bookwyrm/templates/layout.html:64
msgid "Main navigation menu"
msgstr "Navigations-Hauptmenü"
#: bookwyrm/templates/layout.html:72
#: bookwyrm/templates/layout.html:74
msgid "Feed"
msgstr "Feed"
#: bookwyrm/templates/layout.html:116
#: bookwyrm/templates/layout.html:118
msgid "Settings"
msgstr "Einstellungen"
#: bookwyrm/templates/layout.html:125
#: bookwyrm/templates/layout.html:127
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
@ -1843,46 +1981,46 @@ msgstr "Einstellungen"
msgid "Invites"
msgstr "Einladungen"
#: bookwyrm/templates/layout.html:132
#: bookwyrm/templates/layout.html:134
msgid "Admin"
msgstr "Administration"
#: bookwyrm/templates/layout.html:139
#: bookwyrm/templates/layout.html:141
msgid "Log out"
msgstr "Abmelden"
#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148
#: bookwyrm/templates/layout.html:149 bookwyrm/templates/layout.html:150
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Benachrichtigungen"
#: bookwyrm/templates/layout.html:175 bookwyrm/templates/ostatus/error.html:33
#: bookwyrm/templates/layout.html:177 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr "Passwort"
#: bookwyrm/templates/layout.html:187
#: bookwyrm/templates/layout.html:189
msgid "Join"
msgstr "Beitreten"
#: bookwyrm/templates/layout.html:221
#: bookwyrm/templates/layout.html:223
msgid "Successfully posted status"
msgstr "Status veröffentlicht"
#: bookwyrm/templates/layout.html:222
#: bookwyrm/templates/layout.html:224
msgid "Error posting status"
msgstr "Fehler beim veröffentlichen des Status"
#: bookwyrm/templates/layout.html:238
#: bookwyrm/templates/layout.html:240
msgid "Documentation"
msgstr "Handbuch"
#: bookwyrm/templates/layout.html:245
#: bookwyrm/templates/layout.html:247
#, python-format
msgid "Support %(site_name)s on <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a>"
msgstr "%(site_name)s auf <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a> unterstützen"
#: bookwyrm/templates/layout.html:249
#: bookwyrm/templates/layout.html:251
msgid "BookWyrm's source code is freely available. You can contribute or report issues on <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a>."
msgstr "BookWyrm ist open source Software. Du kannst dich auf <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a> beteiligen oder etwas melden."
@ -2075,15 +2213,11 @@ msgstr "Vorschlagen"
msgid "Embed this list on a website"
msgstr ""
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
msgid "Copy embed code"
msgstr ""
#: bookwyrm/templates/lists/list.html:193
msgid "Copied!"
msgstr ""
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr ""
@ -2310,7 +2444,7 @@ msgstr ""
#: bookwyrm/templates/ostatus/error.html:51
#, python-format
msgid "You have blocked <strong>%(account)s</strong>"
msgstr ""
msgstr "Du hast <strong>%(account)s</strong> blockiert"
#: bookwyrm/templates/ostatus/error.html:55
#, python-format
@ -2343,7 +2477,7 @@ msgstr ""
#: bookwyrm/templates/ostatus/remote_follow.html:42
msgid "Follow!"
msgstr ""
msgstr "Folgen!"
#: bookwyrm/templates/ostatus/remote_follow_button.html:8
msgid "Follow on Fediverse"
@ -2371,7 +2505,7 @@ msgstr ""
#: bookwyrm/templates/ostatus/subscribe.html:18
msgid "Uh oh..."
msgstr ""
msgstr "Oh oh..."
#: bookwyrm/templates/ostatus/subscribe.html:20
msgid "Let's log in first..."
@ -4145,7 +4279,7 @@ msgstr "Datei überschreitet die maximale Größe von 10MB"
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/imports/import_data.py:64
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Keine gültige CSV-Datei"

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-15 02:53+0000\n"
"POT-Creation-Date: 2021-12-29 21:32+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"
@ -61,7 +61,7 @@ msgstr ""
msgid "Rating"
msgstr ""
#: bookwyrm/forms.py:473 bookwyrm/templates/lists/list.html:110
#: bookwyrm/forms.py:473 bookwyrm/templates/lists/list.html:121
msgid "Sort By"
msgstr ""
@ -73,16 +73,16 @@ msgstr ""
msgid "Descending"
msgstr ""
#: bookwyrm/importers/importer.py:141 bookwyrm/importers/importer.py:163
#: bookwyrm/importers/importer.py:145 bookwyrm/importers/importer.py:167
msgid "Error loading book"
msgstr ""
#: bookwyrm/importers/importer.py:150
#: bookwyrm/importers/importer.py:154
msgid "Could not find a match for book"
msgstr ""
#: bookwyrm/models/base_model.py:17
#: bookwyrm/templates/import/import_status.html:190
#: bookwyrm/templates/import/import_status.html:200
msgid "Pending"
msgstr ""
@ -145,7 +145,7 @@ msgstr ""
msgid "%(value)s is not a valid username"
msgstr ""
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:170
#: bookwyrm/templates/ostatus/error.html:29
msgid "username"
msgstr ""
@ -244,6 +244,136 @@ msgstr ""
msgid "Something went wrong! Sorry about that."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:7
#: bookwyrm/templates/feed/summary_card.html:8
#, python-format
msgid "%(year)s in the books"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:43
#, python-format
msgid "%(year)s <em>in the books</em>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:47
#, python-format
msgid "<em>%(display_name)ss</em> year of reading"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:53
msgid "Share this page"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:217
msgid "Copied!"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: <strong>public with key</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:78
msgid "The page can be seen by anyone with the complete address."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: <strong>private</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:99
msgid "When you make your page private, the old key wont give access to the page anymore. A new key will be created if the page is once again made public."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didnt finish any book in %(year)s"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
msgid "In %(year)s, %(display_name)s read %(books_total)s book<br />for a total of %(pages_total)s pages!"
msgid_plural "In %(year)s, %(display_name)s read %(books_total)s books<br />for a total of %(pages_total)s pages!"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/annual_summary/layout.html:124
msgid "Thats great!"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesnt have pages)"
msgid_plural "(%(no_page_number)s books dont have pages)"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:155
#: bookwyrm/templates/annual_summary/layout.html:176
#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:161
#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "<strong>%(pages)s</strong> pages"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
msgid "%(display_name)s left %(ratings_total)s rating, <br />their average rating is %(rating_average)s"
msgid_plural "%(display_name)s left %(ratings_total)s ratings, <br />their average rating is %(rating_average)s"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: <strong>%(rating)s</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
msgid "All the books %(display_name)s read in %(year)s"
msgstr ""
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
@ -390,7 +520,7 @@ msgstr ""
#: bookwyrm/templates/book/readthrough.html:76
#: bookwyrm/templates/groups/form.html:24
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/form.html:75
#: bookwyrm/templates/lists/form.html:124
#: bookwyrm/templates/preferences/edit_user.html:124
#: bookwyrm/templates/settings/announcements/announcement_form.html:76
#: bookwyrm/templates/settings/federation/edit_instance.html:82
@ -432,13 +562,6 @@ msgstr ""
msgid "Confirm"
msgstr ""
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr ""
#: bookwyrm/templates/book/book.html:55 bookwyrm/templates/book/book.html:56
msgid "Edit Book"
msgstr ""
@ -519,7 +642,7 @@ msgstr ""
msgid "Places"
msgstr ""
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:75
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -533,7 +656,7 @@ msgstr ""
#: bookwyrm/templates/book/book.html:341
#: bookwyrm/templates/book/cover_modal.html:31
#: bookwyrm/templates/lists/list.html:182
#: bookwyrm/templates/lists/list.html:195
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
msgid "Add"
@ -817,8 +940,8 @@ msgstr ""
#: bookwyrm/templates/components/modal.html:11
#: bookwyrm/templates/components/tooltip.html:7
#: bookwyrm/templates/feed/layout.html:71
#: bookwyrm/templates/get_started/layout.html:20
#: bookwyrm/templates/get_started/layout.html:53
#: bookwyrm/templates/get_started/layout.html:25
#: bookwyrm/templates/get_started/layout.html:58
#: bookwyrm/templates/search/book.html:49
#: bookwyrm/templates/snippets/announcement.html:18
msgid "Close"
@ -894,7 +1017,7 @@ msgstr ""
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
#: bookwyrm/templates/layout.html:101
#: bookwyrm/templates/layout.html:100
msgid "Directory"
msgstr ""
@ -914,6 +1037,8 @@ msgstr ""
#: bookwyrm/templates/directory/directory.html:29
#: bookwyrm/templates/directory/directory.html:31
#: bookwyrm/templates/feed/goal_card.html:17
#: bookwyrm/templates/feed/summary_card.html:12
#: bookwyrm/templates/feed/summary_card.html:14
#: bookwyrm/templates/snippets/announcement.html:34
msgid "Dismiss message"
msgstr ""
@ -1012,7 +1137,7 @@ msgstr ""
#: bookwyrm/templates/discover/discover.html:4
#: bookwyrm/templates/discover/discover.html:10
#: bookwyrm/templates/layout.html:78
#: bookwyrm/templates/layout.html:77
msgid "Discover"
msgstr ""
@ -1129,18 +1254,18 @@ msgstr ""
msgid "Reset your %(site_name)s password"
msgstr ""
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:39
#, python-format
msgid "%(site_name)s home page"
msgstr ""
#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:229
#, python-format
msgid "About %(site_name)s"
msgstr ""
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:234
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:233
msgid "Contact site admin"
msgstr ""
@ -1154,7 +1279,7 @@ msgid "Direct Messages with <a href=\"%(path)s\">%(username)s</a>"
msgstr ""
#: bookwyrm/templates/feed/direct_messages.html:10
#: bookwyrm/templates/layout.html:111
#: bookwyrm/templates/layout.html:110
msgid "Direct Messages"
msgstr ""
@ -1183,11 +1308,11 @@ msgstr ""
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr ""
#: bookwyrm/templates/feed/feed.html:80
#: bookwyrm/templates/feed/feed.html:86
msgid "There aren't any activities right now! Try following a user to get started"
msgstr ""
#: bookwyrm/templates/feed/feed.html:81
#: bookwyrm/templates/feed/feed.html:87
msgid "Alternatively, you can try enabling more status types"
msgstr ""
@ -1207,7 +1332,7 @@ msgstr ""
msgid "Updates"
msgstr ""
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:105
msgid "Your Books"
msgstr ""
@ -1261,6 +1386,15 @@ msgstr ""
msgid "View directory"
msgstr ""
#: bookwyrm/templates/feed/summary_card.html:21
msgid "The end of the year is the best moment to take stock of all the books read during the last 12 months. How many pages have you read? Which book is your best-rated of the year? We compiled these stats, and more!"
msgstr ""
#: bookwyrm/templates/feed/summary_card.html:26
#, python-format
msgid "Discover your stats for %(year)s!"
msgstr ""
#: bookwyrm/templates/get_started/book_preview.html:6
#, python-format
msgid "Have you read %(book_title)s?"
@ -1275,7 +1409,7 @@ msgid "What are you reading?"
msgstr ""
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:149
msgid "Search for a book"
msgstr ""
@ -1294,8 +1428,8 @@ msgstr ""
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/group.html:19
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51
#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:153
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1311,12 +1445,12 @@ msgid "Popular on %(site_name)s"
msgstr ""
#: bookwyrm/templates/get_started/books.html:58
#: bookwyrm/templates/lists/list.html:155
#: bookwyrm/templates/lists/list.html:166
msgid "No books found"
msgstr ""
#: bookwyrm/templates/get_started/books.html:63
#: bookwyrm/templates/get_started/profile.html:51
#: bookwyrm/templates/get_started/profile.html:64
msgid "Save &amp; continue"
msgstr ""
@ -1325,33 +1459,33 @@ msgstr ""
msgid "Welcome"
msgstr ""
#: bookwyrm/templates/get_started/layout.html:15
#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr ""
#: bookwyrm/templates/get_started/layout.html:17
#: bookwyrm/templates/get_started/layout.html:22
msgid "These are some first steps to get you started."
msgstr ""
#: bookwyrm/templates/get_started/layout.html:31
#: bookwyrm/templates/get_started/layout.html:36
#: bookwyrm/templates/get_started/profile.html:6
msgid "Create your profile"
msgstr ""
#: bookwyrm/templates/get_started/layout.html:35
#: bookwyrm/templates/get_started/layout.html:40
msgid "Add books"
msgstr ""
#: bookwyrm/templates/get_started/layout.html:39
#: bookwyrm/templates/get_started/layout.html:44
msgid "Find friends"
msgstr ""
#: bookwyrm/templates/get_started/layout.html:45
#: bookwyrm/templates/get_started/layout.html:50
msgid "Skip this step"
msgstr ""
#: bookwyrm/templates/get_started/layout.html:49
#: bookwyrm/templates/get_started/layout.html:54
msgid "Finish"
msgstr ""
@ -1360,29 +1494,29 @@ msgstr ""
msgid "Display name:"
msgstr ""
#: bookwyrm/templates/get_started/profile.html:21
#: bookwyrm/templates/get_started/profile.html:29
#: bookwyrm/templates/preferences/edit_user.html:47
msgid "Summary:"
msgstr ""
#: bookwyrm/templates/get_started/profile.html:22
#: bookwyrm/templates/get_started/profile.html:34
msgid "A little bit about you"
msgstr ""
#: bookwyrm/templates/get_started/profile.html:30
#: bookwyrm/templates/get_started/profile.html:43
#: bookwyrm/templates/preferences/edit_user.html:27
msgid "Avatar:"
msgstr ""
#: bookwyrm/templates/get_started/profile.html:39
#: bookwyrm/templates/get_started/profile.html:52
msgid "Manually approve followers:"
msgstr ""
#: bookwyrm/templates/get_started/profile.html:45
#: bookwyrm/templates/get_started/profile.html:58
msgid "Show this account in suggested users:"
msgstr ""
#: bookwyrm/templates/get_started/profile.html:49
#: bookwyrm/templates/get_started/profile.html:62
msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users."
msgstr ""
@ -1506,28 +1640,28 @@ msgstr ""
msgid "Data source:"
msgstr ""
#: bookwyrm/templates/import/import.html:37
#: bookwyrm/templates/import/import.html:40
msgid "Data file:"
msgstr ""
#: bookwyrm/templates/import/import.html:45
#: bookwyrm/templates/import/import.html:48
msgid "Include reviews"
msgstr ""
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:53
msgid "Privacy setting for imported reviews:"
msgstr ""
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/settings/federation/instance_blocklist.html:64
msgid "Import"
msgstr ""
#: bookwyrm/templates/import/import.html:61
#: bookwyrm/templates/import/import.html:64
msgid "Recent Imports"
msgstr ""
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/import/import.html:66
msgid "No recent imports"
msgstr ""
@ -1595,27 +1729,31 @@ msgstr ""
msgid "ISBN"
msgstr ""
#: bookwyrm/templates/import/import_status.html:109
#: bookwyrm/templates/import/import_status.html:110
msgid "Openlibrary key"
msgstr ""
#: bookwyrm/templates/import/import_status.html:114
#: bookwyrm/templates/shelf/shelf.html:145
#: bookwyrm/templates/shelf/shelf.html:169
msgid "Author"
msgstr ""
#: bookwyrm/templates/import/import_status.html:112
#: bookwyrm/templates/import/import_status.html:117
msgid "Shelf"
msgstr ""
#: bookwyrm/templates/import/import_status.html:115
#: bookwyrm/templates/import/import_status.html:120
#: bookwyrm/templates/import/manual_review.html:13
#: bookwyrm/templates/snippets/create_status.html:17
msgid "Review"
msgstr ""
#: bookwyrm/templates/import/import_status.html:119
#: bookwyrm/templates/import/import_status.html:124
msgid "Book"
msgstr ""
#: bookwyrm/templates/import/import_status.html:122
#: bookwyrm/templates/import/import_status.html:127
#: bookwyrm/templates/settings/announcements/announcements.html:38
#: bookwyrm/templates/settings/federation/instance_list.html:46
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44
@ -1625,31 +1763,31 @@ msgstr ""
msgid "Status"
msgstr ""
#: bookwyrm/templates/import/import_status.html:130
#: bookwyrm/templates/import/import_status.html:135
msgid "Import preview unavailable."
msgstr ""
#: bookwyrm/templates/import/import_status.html:162
#: bookwyrm/templates/import/import_status.html:172
msgid "View imported review"
msgstr ""
#: bookwyrm/templates/import/import_status.html:176
#: bookwyrm/templates/import/import_status.html:186
msgid "Imported"
msgstr ""
#: bookwyrm/templates/import/import_status.html:182
#: bookwyrm/templates/import/import_status.html:192
msgid "Needs manual review"
msgstr ""
#: bookwyrm/templates/import/import_status.html:195
#: bookwyrm/templates/import/import_status.html:205
msgid "Retry"
msgstr ""
#: bookwyrm/templates/import/import_status.html:213
#: bookwyrm/templates/import/import_status.html:223
msgid "This import is in an old format that is no longer supported. If you would like to troubleshoot missing items from this import, click the button below to update the import format."
msgstr ""
#: bookwyrm/templates/import/import_status.html:215
#: bookwyrm/templates/import/import_status.html:225
msgid "Update import"
msgstr ""
@ -1770,7 +1908,7 @@ msgid "Login"
msgstr ""
#: bookwyrm/templates/landing/login.html:7
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:179
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:178
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr ""
@ -1779,7 +1917,7 @@ msgstr ""
msgid "Success! Email address confirmed."
msgstr ""
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:169
#: bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
@ -1787,12 +1925,12 @@ msgstr ""
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
#: bookwyrm/templates/layout.html:174 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/layout.html:173 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/snippets/register_form.html:20
msgid "Password:"
msgstr ""
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:176
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:175
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr ""
@ -1820,23 +1958,23 @@ msgstr ""
msgid "%(site_name)s search"
msgstr ""
#: bookwyrm/templates/layout.html:43
#: bookwyrm/templates/layout.html:45
msgid "Search for a book, user, or list"
msgstr ""
#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62
#: bookwyrm/templates/layout.html:63
msgid "Main navigation menu"
msgstr ""
#: bookwyrm/templates/layout.html:72
#: bookwyrm/templates/layout.html:71
msgid "Feed"
msgstr ""
#: bookwyrm/templates/layout.html:116
#: bookwyrm/templates/layout.html:115
msgid "Settings"
msgstr ""
#: bookwyrm/templates/layout.html:125
#: bookwyrm/templates/layout.html:124
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
@ -1844,46 +1982,46 @@ msgstr ""
msgid "Invites"
msgstr ""
#: bookwyrm/templates/layout.html:132
#: bookwyrm/templates/layout.html:131
msgid "Admin"
msgstr ""
#: bookwyrm/templates/layout.html:139
#: bookwyrm/templates/layout.html:138
msgid "Log out"
msgstr ""
#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148
#: bookwyrm/templates/layout.html:146 bookwyrm/templates/layout.html:147
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr ""
#: bookwyrm/templates/layout.html:175 bookwyrm/templates/ostatus/error.html:33
#: bookwyrm/templates/layout.html:174 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr ""
#: bookwyrm/templates/layout.html:187
#: bookwyrm/templates/layout.html:186
msgid "Join"
msgstr ""
#: bookwyrm/templates/layout.html:221
#: bookwyrm/templates/layout.html:220
msgid "Successfully posted status"
msgstr ""
#: bookwyrm/templates/layout.html:222
#: bookwyrm/templates/layout.html:221
msgid "Error posting status"
msgstr ""
#: bookwyrm/templates/layout.html:238
#: bookwyrm/templates/layout.html:237
msgid "Documentation"
msgstr ""
#: bookwyrm/templates/layout.html:245
#: bookwyrm/templates/layout.html:244
#, python-format
msgid "Support %(site_name)s on <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a>"
msgstr ""
#: bookwyrm/templates/layout.html:249
#: bookwyrm/templates/layout.html:248
msgid "BookWyrm's source code is freely available. You can contribute or report issues on <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a>."
msgstr ""
@ -1959,56 +2097,56 @@ msgstr ""
msgid "List curation:"
msgstr ""
#: bookwyrm/templates/lists/form.html:22
#: bookwyrm/templates/lists/form.html:31
msgid "Closed"
msgstr ""
#: bookwyrm/templates/lists/form.html:23
#: bookwyrm/templates/lists/form.html:34
msgid "Only you can add and remove books to this list"
msgstr ""
#: bookwyrm/templates/lists/form.html:27
#: bookwyrm/templates/lists/form.html:48
msgid "Curated"
msgstr ""
#: bookwyrm/templates/lists/form.html:28
#: bookwyrm/templates/lists/form.html:51
msgid "Anyone can suggest books, subject to your approval"
msgstr ""
#: bookwyrm/templates/lists/form.html:32
#: bookwyrm/templates/lists/form.html:65
msgctxt "curation type"
msgid "Open"
msgstr ""
#: bookwyrm/templates/lists/form.html:33
#: bookwyrm/templates/lists/form.html:68
msgid "Anyone can add books to this list"
msgstr ""
#: bookwyrm/templates/lists/form.html:37
#: bookwyrm/templates/lists/form.html:82
msgid "Group"
msgstr ""
#: bookwyrm/templates/lists/form.html:38
#: bookwyrm/templates/lists/form.html:85
msgid "Group members can add to and remove from this list"
msgstr ""
#: bookwyrm/templates/lists/form.html:41
#: bookwyrm/templates/lists/form.html:90
msgid "Select Group"
msgstr ""
#: bookwyrm/templates/lists/form.html:45
#: bookwyrm/templates/lists/form.html:94
msgid "Select a group"
msgstr ""
#: bookwyrm/templates/lists/form.html:56
#: bookwyrm/templates/lists/form.html:105
msgid "You don't have any Groups yet!"
msgstr ""
#: bookwyrm/templates/lists/form.html:58
#: bookwyrm/templates/lists/form.html:107
msgid "Create a Group"
msgstr ""
#: bookwyrm/templates/lists/form.html:81
#: bookwyrm/templates/lists/form.html:130
msgid "Delete list"
msgstr ""
@ -2025,66 +2163,62 @@ msgstr ""
msgid "Added by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr ""
#: bookwyrm/templates/lists/list.html:76
#: bookwyrm/templates/lists/list.html:82
msgid "List position"
msgstr ""
#: bookwyrm/templates/lists/list.html:82
#: bookwyrm/templates/lists/list.html:88
msgid "Set"
msgstr ""
#: bookwyrm/templates/lists/list.html:92
#: bookwyrm/templates/lists/list.html:103
#: bookwyrm/templates/snippets/remove_from_group_button.html:19
msgid "Remove"
msgstr ""
#: bookwyrm/templates/lists/list.html:106
#: bookwyrm/templates/lists/list.html:123
#: bookwyrm/templates/lists/list.html:117
#: bookwyrm/templates/lists/list.html:134
msgid "Sort List"
msgstr ""
#: bookwyrm/templates/lists/list.html:116
#: bookwyrm/templates/lists/list.html:127
msgid "Direction"
msgstr ""
#: bookwyrm/templates/lists/list.html:130
#: bookwyrm/templates/lists/list.html:141
msgid "Add Books"
msgstr ""
#: bookwyrm/templates/lists/list.html:132
#: bookwyrm/templates/lists/list.html:143
msgid "Suggest Books"
msgstr ""
#: bookwyrm/templates/lists/list.html:143
#: bookwyrm/templates/lists/list.html:154
msgid "search"
msgstr ""
#: bookwyrm/templates/lists/list.html:149
#: bookwyrm/templates/lists/list.html:160
msgid "Clear search"
msgstr ""
#: bookwyrm/templates/lists/list.html:154
#: bookwyrm/templates/lists/list.html:165
#, python-format
msgid "No books found matching the query \"%(query)s\""
msgstr ""
#: bookwyrm/templates/lists/list.html:182
#: bookwyrm/templates/lists/list.html:197
msgid "Suggest"
msgstr ""
#: bookwyrm/templates/lists/list.html:191
#: bookwyrm/templates/lists/list.html:208
msgid "Embed this list on a website"
msgstr ""
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:216
msgid "Copy embed code"
msgstr ""
#: bookwyrm/templates/lists/list.html:193
msgid "Copied!"
msgstr ""
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:218
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr ""
@ -2563,7 +2697,7 @@ msgstr ""
msgid "Edit Announcement"
msgstr ""
#: bookwyrm/templates/settings/announcements/announcement.html:35
#: bookwyrm/templates/settings/announcements/announcement.html:34
msgid "Visible:"
msgstr ""
@ -2575,19 +2709,19 @@ msgstr ""
msgid "False"
msgstr ""
#: bookwyrm/templates/settings/announcements/announcement.html:47
#: bookwyrm/templates/settings/announcements/announcement.html:46
#: bookwyrm/templates/settings/announcements/announcement_form.html:44
#: bookwyrm/templates/settings/dashboard/dashboard.html:71
msgid "Start date:"
msgstr ""
#: bookwyrm/templates/settings/announcements/announcement.html:54
#: bookwyrm/templates/settings/announcements/announcement.html:51
#: bookwyrm/templates/settings/announcements/announcement_form.html:54
#: bookwyrm/templates/settings/dashboard/dashboard.html:77
msgid "End date:"
msgstr ""
#: bookwyrm/templates/settings/announcements/announcement.html:60
#: bookwyrm/templates/settings/announcements/announcement.html:55
#: bookwyrm/templates/settings/announcements/announcement_form.html:64
msgid "Active:"
msgstr ""
@ -4146,11 +4280,11 @@ msgstr ""
msgid "%(title)s: %(subtitle)s"
msgstr ""
#: bookwyrm/views/imports/import_data.py:64
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr ""
#: bookwyrm/views/landing/login.py:69
#: bookwyrm/views/landing/login.py:70
msgid "Username or password are incorrect"
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: 2021-12-08 15:40+0000\n"
"PO-Revision-Date: 2021-12-09 18:56\n"
"POT-Creation-Date: 2021-12-28 20:12+0000\n"
"PO-Revision-Date: 2021-12-28 22:55\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Spanish\n"
"Language: es\n"
@ -72,16 +72,16 @@ msgstr "Ascendente"
msgid "Descending"
msgstr "Descendente"
#: bookwyrm/importers/importer.py:141 bookwyrm/importers/importer.py:163
#: bookwyrm/importers/importer.py:145 bookwyrm/importers/importer.py:167
msgid "Error loading book"
msgstr "Error en cargar libro"
#: bookwyrm/importers/importer.py:150
#: bookwyrm/importers/importer.py:154
msgid "Could not find a match for book"
msgstr "No se pudo encontrar el libro"
#: bookwyrm/models/base_model.py:17
#: bookwyrm/templates/import/import_status.html:190
#: bookwyrm/templates/import/import_status.html:200
msgid "Pending"
msgstr "Pendiente"
@ -144,7 +144,7 @@ msgstr "%(value)s no es un remote_id válido"
msgid "%(value)s is not a valid username"
msgstr "%(value)s no es un usuario válido"
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:173
#: bookwyrm/templates/ostatus/error.html:29
msgid "username"
msgstr "nombre de usuario"
@ -243,6 +243,136 @@ msgstr "Error del Servidor"
msgid "Something went wrong! Sorry about that."
msgstr "¡Algo salió mal! Disculpa."
#: bookwyrm/templates/annual_summary/layout.html:7
#: bookwyrm/templates/feed/summary_card.html:8
#, python-format
msgid "%(year)s in the books"
msgstr "%(year)s en libros"
#: bookwyrm/templates/annual_summary/layout.html:43
#, python-format
msgid "%(year)s <em>in the books</em>"
msgstr "%(year)s <em>en libros</em>"
#: bookwyrm/templates/annual_summary/layout.html:47
#, python-format
msgid "<em>%(display_name)ss</em> year of reading"
msgstr "El año de lectura de <em>%(display_name)s</em>"
#: bookwyrm/templates/annual_summary/layout.html:53
msgid "Share this page"
msgstr "Compartir esta página"
#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr "Copiar dirección"
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr "¡Copiado!"
#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: <strong>public with key</strong>"
msgstr "Nivel de compartido: <strong>público con llave</strong>"
#: bookwyrm/templates/annual_summary/layout.html:78
msgid "The page can be seen by anyone with the complete address."
msgstr "La página puede ser vista por cualquier persona que tenga la dirección completa."
#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr "Hacer privada la página"
#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: <strong>private</strong>"
msgstr "Nivel de compartido: <strong>privado</strong>"
#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr "La página es privada, solo tú puedes verla."
#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr "Hacer pública la página"
#: bookwyrm/templates/annual_summary/layout.html:99
msgid "When you make your page private, the old key wont give access to the page anymore. A new key will be created if the page is once again made public."
msgstr "Una vez que haces privada tu página, la clave antigua ya no dará acceso a la página. Si la página se vuelve a hacer pública se creará una nueva clave."
#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didnt finish any book in %(year)s"
msgstr "Lamentablemente, %(display_name)s no terminó ningún libro en %(year)s"
#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
msgid "In %(year)s, %(display_name)s read %(books_total)s book<br />for a total of %(pages_total)s pages!"
msgid_plural "In %(year)s, %(display_name)s read %(books_total)s books<br />for a total of %(pages_total)s pages!"
msgstr[0] "En %(year)s %(display_name)s ha leído %(books_total)s libro<br />¡haciendo un total de %(pages_total)s páginas!"
msgstr[1] "En %(year)s %(display_name)s ha leído %(books_total)s libros<br />¡haciendo un total de %(pages_total)s páginas!"
#: bookwyrm/templates/annual_summary/layout.html:124
msgid "Thats great!"
msgstr "¡Eso es genial!"
#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr "Eso hace un promedio de %(pages)s páginas por libro."
#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesnt have pages)"
msgid_plural "(%(no_page_number)s books dont have pages)"
msgstr[0] "(%(no_page_number)s libro no tiene páginas)"
msgstr[1] "(%(no_page_number)s libros no tienen páginas)"
#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr "Su lectura más corta de este año…"
#: bookwyrm/templates/annual_summary/layout.html:155
#: bookwyrm/templates/annual_summary/layout.html:176
#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "por"
#: bookwyrm/templates/annual_summary/layout.html:161
#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "<strong>%(pages)s</strong> pages"
msgstr "<strong>%(pages)s</strong> páginas"
#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr "… y la más larga"
#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
msgid "%(display_name)s left %(ratings_total)s rating, <br />their average rating is %(rating_average)s"
msgid_plural "%(display_name)s left %(ratings_total)s ratings, <br />their average rating is %(rating_average)s"
msgstr[0] "%(display_name)s dio %(ratings_total)s valoración, <br />su valoración media es %(rating_average)s"
msgstr[1] "%(display_name)s dio %(ratings_total)s valoraciones, <br />su valoración media es %(rating_average)s"
#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr "Su mejor valoración"
#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: <strong>%(rating)s</strong>"
msgstr "Su valoración: <strong>%(rating)s</strong>"
#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
msgid "All the books %(display_name)s read in %(year)s"
msgstr "Todos los libros que ha leído %(display_name)s en %(year)s"
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
@ -267,7 +397,7 @@ msgstr "Muerto:"
#: bookwyrm/templates/author/author.html:70
msgid "External links"
msgstr ""
msgstr "Enlaces externos"
#: bookwyrm/templates/author/author.html:75
msgid "Wikipedia"
@ -282,7 +412,7 @@ msgstr "Ver registro ISNI"
#: bookwyrm/templates/book/book.html:93
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr ""
msgstr "Cargar datos"
#: bookwyrm/templates/author/author.html:92
#: bookwyrm/templates/book/book.html:96
@ -381,7 +511,7 @@ msgstr "Clave Goodreads:"
#: bookwyrm/templates/author/edit_author.html:105
msgid "ISNI:"
msgstr ""
msgstr "ISNI:"
#: bookwyrm/templates/author/edit_author.html:115
#: bookwyrm/templates/book/book.html:157
@ -420,7 +550,7 @@ msgstr "Cancelar"
#: bookwyrm/templates/author/sync_modal.html:15
#, python-format
msgid "Loading data will connect to <strong>%(source_name)s</strong> and check for any metadata about this author which aren't present here. Existing metadata will not be overwritten."
msgstr ""
msgstr "La carga de datos se conectará a <strong>%(source_name)s</strong> y comprobará si hay metadatos sobre este autor que no están presentes aquí. Los metadatos existentes no serán sobrescritos."
#: bookwyrm/templates/author/sync_modal.html:23
#: bookwyrm/templates/book/edit/edit_book.html:108
@ -431,13 +561,6 @@ msgstr ""
msgid "Confirm"
msgstr "Confirmar"
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "por"
#: bookwyrm/templates/book/book.html:55 bookwyrm/templates/book/book.html:56
msgid "Edit Book"
msgstr "Editar Libro"
@ -518,7 +641,7 @@ msgstr "Sujetos"
msgid "Places"
msgstr "Lugares"
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:75
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:77
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -810,7 +933,7 @@ msgstr "Eliminar estas fechas de lectura"
#: bookwyrm/templates/book/sync_modal.html:15
#, python-format
msgid "Loading data will connect to <strong>%(source_name)s</strong> and check for any metadata about this book which aren't present here. Existing metadata will not be overwritten."
msgstr ""
msgstr "La carga de datos se conectará a <strong>%(source_name)s</strong> y comprobará si hay metadatos sobre este libro que no están presentes aquí. Los metadatos existentes no serán sobrescritos."
#: bookwyrm/templates/components/inline_form.html:8
#: bookwyrm/templates/components/modal.html:11
@ -893,7 +1016,7 @@ msgstr "Comunidad federalizada"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
#: bookwyrm/templates/layout.html:101
#: bookwyrm/templates/layout.html:103
msgid "Directory"
msgstr "Directorio"
@ -913,6 +1036,8 @@ msgstr "Puedes optar por no en cualquier hora en tus <a href=\"%(path)s\">config
#: bookwyrm/templates/directory/directory.html:29
#: bookwyrm/templates/directory/directory.html:31
#: bookwyrm/templates/feed/goal_card.html:17
#: bookwyrm/templates/feed/summary_card.html:12
#: bookwyrm/templates/feed/summary_card.html:14
#: bookwyrm/templates/snippets/announcement.html:34
msgid "Dismiss message"
msgstr "Descartar mensaje"
@ -1011,7 +1136,7 @@ msgstr "<a href=\"%(user_path)s\">%(username)s</a> citó <a href=\"%(book_path)s
#: bookwyrm/templates/discover/discover.html:4
#: bookwyrm/templates/discover/discover.html:10
#: bookwyrm/templates/layout.html:78
#: bookwyrm/templates/layout.html:80
msgid "Discover"
msgstr "Descubrir"
@ -1128,24 +1253,24 @@ msgstr "Si no solicitaste reestablecer tu contraseña, puedes ignorar este mensa
msgid "Reset your %(site_name)s password"
msgstr "Reestablece tu contraseña de %(site_name)s"
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:39
#, python-format
msgid "%(site_name)s home page"
msgstr ""
msgstr "Página de inicio de %(site_name)s"
#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:232
#, python-format
msgid "About %(site_name)s"
msgstr "Sobre %(site_name)s"
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:234
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:236
msgid "Contact site admin"
msgstr "Comuníquese con el administrador del sitio"
#: bookwyrm/templates/embed-layout.html:46
msgid "Join Bookwyrm"
msgstr ""
msgstr "Únete a BookWyrm"
#: bookwyrm/templates/feed/direct_messages.html:8
#, python-format
@ -1153,7 +1278,7 @@ msgid "Direct Messages with <a href=\"%(path)s\">%(username)s</a>"
msgstr "Mensajes directos con <a href=\"%(path)s\">%(username)s</a>"
#: bookwyrm/templates/feed/direct_messages.html:10
#: bookwyrm/templates/layout.html:111
#: bookwyrm/templates/layout.html:113
msgid "Direct Messages"
msgstr "Mensajes directos"
@ -1182,11 +1307,11 @@ msgstr "Guardar ajustes"
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr "cargar <span data-poll=\"stream/%(tab_key)s\">0</span> estado(s) no leído(s)"
#: bookwyrm/templates/feed/feed.html:80
#: bookwyrm/templates/feed/feed.html:86
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "¡No hay actividad ahora mismo! Sigue a otro usuario para empezar"
#: bookwyrm/templates/feed/feed.html:81
#: bookwyrm/templates/feed/feed.html:87
msgid "Alternatively, you can try enabling more status types"
msgstr "Alternativamente, puedes intentar habilitar más tipos de estado"
@ -1206,7 +1331,7 @@ msgstr "Puedes establecer o cambiar tu objetivo de lectura en cualquier momento
msgid "Updates"
msgstr "Actualizaciones"
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:108
msgid "Your Books"
msgstr "Tus libros"
@ -1260,6 +1385,15 @@ msgstr "No mostrar usuarios sugeridos"
msgid "View directory"
msgstr "Ver directorio"
#: bookwyrm/templates/feed/summary_card.html:21
msgid "The end of the year is the best moment to take stock of all the books read during the last 12 months. How many pages have you read? Which book is your best-rated of the year? We compiled these stats, and more!"
msgstr "El fin del año es el mejor momento para hacer balance de todos los libros leídos durante los últimos 12 meses. ¿Cuántas páginas has leído? ¿Cuál es el libro que mejor has valorado este año? ¡Hemos compilado estas estadísticas, y más!"
#: bookwyrm/templates/feed/summary_card.html:26
#, python-format
msgid "Discover your stats for %(year)s!"
msgstr "¡Descubre tus estadísticas de %(year)s!"
#: bookwyrm/templates/get_started/book_preview.html:6
#, python-format
msgid "Have you read %(book_title)s?"
@ -1274,7 +1408,7 @@ msgid "What are you reading?"
msgstr "¿Qué estás leyendo?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:138
msgid "Search for a book"
msgstr "Buscar libros"
@ -1293,8 +1427,8 @@ msgstr "Puedes agregar libros cuando comiences a usar %(site_name)s."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/group.html:19
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51
#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1505,28 +1639,28 @@ msgstr "Importar libros"
msgid "Data source:"
msgstr "Fuente de datos:"
#: bookwyrm/templates/import/import.html:37
#: bookwyrm/templates/import/import.html:40
msgid "Data file:"
msgstr "Archivo de datos:"
#: bookwyrm/templates/import/import.html:45
#: bookwyrm/templates/import/import.html:48
msgid "Include reviews"
msgstr "Incluir reseñas"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:53
msgid "Privacy setting for imported reviews:"
msgstr "Configuración de privacidad para las reseñas importadas:"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/settings/federation/instance_blocklist.html:64
msgid "Import"
msgstr "Importar"
#: bookwyrm/templates/import/import.html:61
#: bookwyrm/templates/import/import.html:64
msgid "Recent Imports"
msgstr "Importaciones recientes"
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/import/import.html:66
msgid "No recent imports"
msgstr "No hay ninguna importación reciente"
@ -1594,27 +1728,31 @@ msgstr "Título"
msgid "ISBN"
msgstr "ISBN"
#: bookwyrm/templates/import/import_status.html:109
#: bookwyrm/templates/import/import_status.html:110
msgid "Openlibrary key"
msgstr "Clave de OpenLibrary"
#: bookwyrm/templates/import/import_status.html:114
#: bookwyrm/templates/shelf/shelf.html:145
#: bookwyrm/templates/shelf/shelf.html:169
msgid "Author"
msgstr "Autor/Autora"
#: bookwyrm/templates/import/import_status.html:112
#: bookwyrm/templates/import/import_status.html:117
msgid "Shelf"
msgstr "Estantería"
#: bookwyrm/templates/import/import_status.html:115
#: bookwyrm/templates/import/import_status.html:120
#: bookwyrm/templates/import/manual_review.html:13
#: bookwyrm/templates/snippets/create_status.html:17
msgid "Review"
msgstr "Reseña"
#: bookwyrm/templates/import/import_status.html:119
#: bookwyrm/templates/import/import_status.html:124
msgid "Book"
msgstr "Libro"
#: bookwyrm/templates/import/import_status.html:122
#: bookwyrm/templates/import/import_status.html:127
#: bookwyrm/templates/settings/announcements/announcements.html:38
#: bookwyrm/templates/settings/federation/instance_list.html:46
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44
@ -1624,31 +1762,31 @@ msgstr "Libro"
msgid "Status"
msgstr "Estado"
#: bookwyrm/templates/import/import_status.html:130
#: bookwyrm/templates/import/import_status.html:135
msgid "Import preview unavailable."
msgstr "Previsualización de la importación no disponible."
#: bookwyrm/templates/import/import_status.html:162
#: bookwyrm/templates/import/import_status.html:172
msgid "View imported review"
msgstr "Ver reseña importada"
#: bookwyrm/templates/import/import_status.html:176
#: bookwyrm/templates/import/import_status.html:186
msgid "Imported"
msgstr "Importado"
#: bookwyrm/templates/import/import_status.html:182
#: bookwyrm/templates/import/import_status.html:192
msgid "Needs manual review"
msgstr "Necesita revisión manual"
#: bookwyrm/templates/import/import_status.html:195
#: bookwyrm/templates/import/import_status.html:205
msgid "Retry"
msgstr "Reintentar"
#: bookwyrm/templates/import/import_status.html:213
#: bookwyrm/templates/import/import_status.html:223
msgid "This import is in an old format that is no longer supported. If you would like to troubleshoot missing items from this import, click the button below to update the import format."
msgstr "Esta importación está en un formato antiguo que ya no es compatible. Si desea solucionar los elementos que faltan en esta importación, haga clic en el botón de abajo para actualizar el formato de importación."
#: bookwyrm/templates/import/import_status.html:215
#: bookwyrm/templates/import/import_status.html:225
msgid "Update import"
msgstr "Actualizar importación"
@ -1769,7 +1907,7 @@ msgid "Login"
msgstr "Iniciar sesión"
#: bookwyrm/templates/landing/login.html:7
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:179
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:181
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr "Iniciar sesión"
@ -1778,7 +1916,7 @@ msgstr "Iniciar sesión"
msgid "Success! Email address confirmed."
msgstr "¡Éxito! Dirección de correo electrónico confirmada."
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:172
#: bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
@ -1786,12 +1924,12 @@ msgstr "Nombre de usuario:"
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
#: bookwyrm/templates/layout.html:174 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/layout.html:176 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/snippets/register_form.html:20
msgid "Password:"
msgstr "Contraseña:"
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:176
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:178
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr "¿Olvidaste tu contraseña?"
@ -1819,23 +1957,23 @@ msgstr "Restablecer contraseña"
msgid "%(site_name)s search"
msgstr "Busqueda en %(site_name)s"
#: bookwyrm/templates/layout.html:43
#: bookwyrm/templates/layout.html:45
msgid "Search for a book, user, or list"
msgstr "Buscar un libro o un usuario o una lista"
#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62
#: bookwyrm/templates/layout.html:63 bookwyrm/templates/layout.html:64
msgid "Main navigation menu"
msgstr "Menú de navigación central"
#: bookwyrm/templates/layout.html:72
#: bookwyrm/templates/layout.html:74
msgid "Feed"
msgstr "Actividad"
#: bookwyrm/templates/layout.html:116
#: bookwyrm/templates/layout.html:118
msgid "Settings"
msgstr "Configuración"
#: bookwyrm/templates/layout.html:125
#: bookwyrm/templates/layout.html:127
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
@ -1843,46 +1981,46 @@ msgstr "Configuración"
msgid "Invites"
msgstr "Invitaciones"
#: bookwyrm/templates/layout.html:132
#: bookwyrm/templates/layout.html:134
msgid "Admin"
msgstr "Administrador"
#: bookwyrm/templates/layout.html:139
#: bookwyrm/templates/layout.html:141
msgid "Log out"
msgstr "Cerrar sesión"
#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148
#: bookwyrm/templates/layout.html:149 bookwyrm/templates/layout.html:150
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Notificaciones"
#: bookwyrm/templates/layout.html:175 bookwyrm/templates/ostatus/error.html:33
#: bookwyrm/templates/layout.html:177 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr "contraseña"
#: bookwyrm/templates/layout.html:187
#: bookwyrm/templates/layout.html:189
msgid "Join"
msgstr "Unirse"
#: bookwyrm/templates/layout.html:221
#: bookwyrm/templates/layout.html:223
msgid "Successfully posted status"
msgstr "Estado publicado con éxito"
#: bookwyrm/templates/layout.html:222
#: bookwyrm/templates/layout.html:224
msgid "Error posting status"
msgstr "Error al publicar el estado"
#: bookwyrm/templates/layout.html:238
#: bookwyrm/templates/layout.html:240
msgid "Documentation"
msgstr "Documentación de Django"
#: bookwyrm/templates/layout.html:245
#: bookwyrm/templates/layout.html:247
#, python-format
msgid "Support %(site_name)s on <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a>"
msgstr "Apoyar %(site_name)s en <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a>"
#: bookwyrm/templates/layout.html:249
#: bookwyrm/templates/layout.html:251
msgid "BookWyrm's source code is freely available. You can contribute or report issues on <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a>."
msgstr "BookWyrm es software de código abierto. Puedes contribuir o reportar problemas en <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a>."
@ -1942,12 +2080,12 @@ msgstr "Editar lista"
#: bookwyrm/templates/lists/embed-list.html:7
#, python-format
msgid "%(list_name)s, a list by %(owner)s"
msgstr ""
msgstr "%(list_name)s, una lista de %(owner)s"
#: bookwyrm/templates/lists/embed-list.html:17
#, python-format
msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr ""
msgstr "en <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:29
@ -2073,20 +2211,16 @@ msgstr "Sugerir"
#: bookwyrm/templates/lists/list.html:191
msgid "Embed this list on a website"
msgstr ""
msgstr "Incrustar esta lista en un sitio web"
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
msgid "Copy embed code"
msgstr ""
msgstr "Copiar código para incrustar"
#: bookwyrm/templates/lists/list.html:193
msgid "Copied!"
msgstr ""
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr ""
msgstr "%(list_name)s, una lista de %(owner)s en %(site_name)s"
#: bookwyrm/templates/lists/list_items.html:15
msgid "Saved"
@ -2276,116 +2410,116 @@ msgstr "¡Estás al día!"
#: bookwyrm/templates/ostatus/error.html:7
#, python-format
msgid "<strong>%(account)s</strong> is not a valid username"
msgstr ""
msgstr "<strong>%(account)s</strong> no es un nombre de usuario válido"
#: bookwyrm/templates/ostatus/error.html:8
#: bookwyrm/templates/ostatus/error.html:13
msgid "Check you have the correct username before trying again"
msgstr ""
msgstr "Comprueba que tienes el nombre de usuario correcto antes de intentarlo de nuevo"
#: bookwyrm/templates/ostatus/error.html:12
#, python-format
msgid "<strong>%(account)s</strong> could not be found or <code>%(remote_domain)s</code> does not support identity discovery"
msgstr ""
msgstr "<strong>%(account)s</strong> no se pudo encontrar o <code>%(remote_domain)s</code> no soporta el descubrimiento de identidad"
#: bookwyrm/templates/ostatus/error.html:17
#, python-format
msgid "<strong>%(account)s</strong> was found but <code>%(remote_domain)s</code> does not support 'remote follow'"
msgstr ""
msgstr "<strong>%(account)s</strong> ha sido encontrado, pero <code>%(remote_domain)s</code> no soporta el 'seguimiento remoto'"
#: bookwyrm/templates/ostatus/error.html:18
#, python-format
msgid "Try searching for <strong>%(user)s</strong> on <code>%(remote_domain)s</code> instead"
msgstr ""
msgstr "Intenta buscar <strong>%(user)s</strong> en <code>%(remote_domain)s</code> en su lugar"
#: bookwyrm/templates/ostatus/error.html:46
#, python-format
msgid "Something went wrong trying to follow <strong>%(account)s</strong>"
msgstr ""
msgstr "Algo salió mal al intentar seguir a <strong>%(account)s</strong>"
#: bookwyrm/templates/ostatus/error.html:47
msgid "Check you have the correct username before trying again."
msgstr ""
msgstr "Comprueba que tienes el nombre de usuario correcto antes de intentarlo de nuevo."
#: bookwyrm/templates/ostatus/error.html:51
#, python-format
msgid "You have blocked <strong>%(account)s</strong>"
msgstr ""
msgstr "Has bloqueado a <strong>%(account)s</strong>"
#: bookwyrm/templates/ostatus/error.html:55
#, python-format
msgid "<strong>%(account)s</strong> has blocked you"
msgstr ""
msgstr "<strong>%(account)s</strong> te ha bloqueado"
#: bookwyrm/templates/ostatus/error.html:59
#, python-format
msgid "You are already following <strong>%(account)s</strong>"
msgstr ""
msgstr "Ya estás siguiendo a <strong>%(account)s</strong>"
#: bookwyrm/templates/ostatus/error.html:63
#, python-format
msgid "You have already requested to follow <strong>%(account)s</strong>"
msgstr ""
msgstr "Ya has solicitado seguir a <strong>%(account)s</strong>"
#: bookwyrm/templates/ostatus/remote_follow.html:6
#, python-format
msgid "Follow %(username)s on the fediverse"
msgstr ""
msgstr "Sigue a %(username)s en el Fediverso"
#: bookwyrm/templates/ostatus/remote_follow.html:33
#, python-format
msgid "Follow %(username)s from another Fediverse account like BookWyrm, Mastodon, or Pleroma."
msgstr ""
msgstr "Sigue a %(username)s desde otra cuenta del Fediverso, como BookWyrm, Mastodon o Pleroma."
#: bookwyrm/templates/ostatus/remote_follow.html:40
msgid "User handle to follow from:"
msgstr ""
msgstr "Nombre de usuario desde el que seguir:"
#: bookwyrm/templates/ostatus/remote_follow.html:42
msgid "Follow!"
msgstr ""
msgstr "¡Seguir!"
#: bookwyrm/templates/ostatus/remote_follow_button.html:8
msgid "Follow on Fediverse"
msgstr ""
msgstr "Seguir en el Fediverso"
#: bookwyrm/templates/ostatus/remote_follow_button.html:12
msgid "This link opens in a pop-up window"
msgstr ""
msgstr "Este enlace se abre en una ventana emergente"
#: bookwyrm/templates/ostatus/subscribe.html:8
#, python-format
msgid "Log in to %(sitename)s"
msgstr ""
msgstr "Iniciar sesión en %(sitename)s"
#: bookwyrm/templates/ostatus/subscribe.html:10
#, python-format
msgid "Error following from %(sitename)s"
msgstr ""
msgstr "Error al seguir desde %(sitename)s"
#: bookwyrm/templates/ostatus/subscribe.html:12
#: bookwyrm/templates/ostatus/subscribe.html:22
#, python-format
msgid "Follow from %(sitename)s"
msgstr ""
msgstr "Seguir desde %(sitename)s"
#: bookwyrm/templates/ostatus/subscribe.html:18
msgid "Uh oh..."
msgstr ""
msgstr "Oh-oh..."
#: bookwyrm/templates/ostatus/subscribe.html:20
msgid "Let's log in first..."
msgstr ""
msgstr "Iniciemos sesión primero..."
#: bookwyrm/templates/ostatus/subscribe.html:51
#, python-format
msgid "Follow %(username)s"
msgstr ""
msgstr "Seguir a %(username)s"
#: bookwyrm/templates/ostatus/success.html:28
#, python-format
msgid "You are now following %(display_name)s!"
msgstr ""
msgstr "¡Ahora sigues a %(display_name)s!"
#: bookwyrm/templates/preferences/blocks.html:4
#: bookwyrm/templates/preferences/blocks.html:7
@ -4145,7 +4279,7 @@ msgstr "Archivo excede el tamaño máximo: 10MB"
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/imports/import_data.py:64
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "No un archivo csv válido"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-08 15:40+0000\n"
"PO-Revision-Date: 2021-12-09 18:55\n"
"POT-Creation-Date: 2021-12-28 20:12+0000\n"
"PO-Revision-Date: 2021-12-28 21:17\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: French\n"
"Language: fr\n"
@ -72,16 +72,16 @@ msgstr "Ordre croissant"
msgid "Descending"
msgstr "Ordre décroissant"
#: bookwyrm/importers/importer.py:141 bookwyrm/importers/importer.py:163
#: bookwyrm/importers/importer.py:145 bookwyrm/importers/importer.py:167
msgid "Error loading book"
msgstr "Erreur lors du chargement du livre"
#: bookwyrm/importers/importer.py:150
#: bookwyrm/importers/importer.py:154
msgid "Could not find a match for book"
msgstr "Impossible de trouver une correspondance pour le livre"
#: bookwyrm/models/base_model.py:17
#: bookwyrm/templates/import/import_status.html:190
#: bookwyrm/templates/import/import_status.html:200
msgid "Pending"
msgstr "En attente"
@ -144,7 +144,7 @@ msgstr "%(value)s nest pas une remote_id valide."
msgid "%(value)s is not a valid username"
msgstr "%(value)s nest pas un nom de compte valide."
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:173
#: bookwyrm/templates/ostatus/error.html:29
msgid "username"
msgstr "nom du compte:"
@ -243,6 +243,136 @@ msgstr "Erreur côté serveur"
msgid "Something went wrong! Sorry about that."
msgstr "Une erreur sest produite; désolé!"
#: bookwyrm/templates/annual_summary/layout.html:7
#: bookwyrm/templates/feed/summary_card.html:8
#, python-format
msgid "%(year)s in the books"
msgstr "les livres de %(year)s"
#: bookwyrm/templates/annual_summary/layout.html:43
#, python-format
msgid "%(year)s <em>in the books</em>"
msgstr "<em>les livres de</em> %(year)s"
#: bookwyrm/templates/annual_summary/layout.html:47
#, python-format
msgid "<em>%(display_name)ss</em> year of reading"
msgstr "lannée de lecture de <em>%(display_name)s</em>"
#: bookwyrm/templates/annual_summary/layout.html:53
msgid "Share this page"
msgstr "Partager cette page"
#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr "Copier ladresse"
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr "Copié!"
#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: <strong>public with key</strong>"
msgstr "Statut de partage : <strong>public avec clé</strong>"
#: bookwyrm/templates/annual_summary/layout.html:78
msgid "The page can be seen by anyone with the complete address."
msgstr "La page peut être consultée par toute personne ayant l'adresse complète."
#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr "Rendre cette page privée"
#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: <strong>private</strong>"
msgstr "Statut de partage : <strong>privé</strong>"
#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr "La page est privée, seulement vous pouvez la voir."
#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr "Rendre cette page publique"
#: bookwyrm/templates/annual_summary/layout.html:99
msgid "When you make your page private, the old key wont give access to the page anymore. A new key will be created if the page is once again made public."
msgstr "Lorsque vous rendez votre page privée, lancienne clé ne donnera plus accès à la page. Une nouvelle clé sera créée si la page est à nouveau rendue publique."
#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didnt finish any book in %(year)s"
msgstr "Malheureusement, %(display_name)s na terminé aucun livre en %(year)s"
#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
msgid "In %(year)s, %(display_name)s read %(books_total)s book<br />for a total of %(pages_total)s pages!"
msgid_plural "In %(year)s, %(display_name)s read %(books_total)s books<br />for a total of %(pages_total)s pages!"
msgstr[0] "En %(year)s, %(display_name)s a lu %(books_total)s livre<br />pour un total de %(pages_total)s pages !"
msgstr[1] "En %(year)s, %(display_name)s a lu %(books_total)s livres<br />pour un total de %(pages_total)s pages !"
#: bookwyrm/templates/annual_summary/layout.html:124
msgid "Thats great!"
msgstr "Cest génial !"
#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr "Ce qui fait en moyenne %(pages)s pages par livre."
#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesnt have pages)"
msgid_plural "(%(no_page_number)s books dont have pages)"
msgstr[0] "(%(no_page_number)s livre na pas de pages)"
msgstr[1] "(%(no_page_number)s livres nont pas de pages)"
#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr "Sa lecture la plus courte lannée…"
#: bookwyrm/templates/annual_summary/layout.html:155
#: bookwyrm/templates/annual_summary/layout.html:176
#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "de"
#: bookwyrm/templates/annual_summary/layout.html:161
#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "<strong>%(pages)s</strong> pages"
msgstr "<strong>%(pages)s</strong> pages"
#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr "…et sa plus longue lecture"
#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
msgid "%(display_name)s left %(ratings_total)s rating, <br />their average rating is %(rating_average)s"
msgid_plural "%(display_name)s left %(ratings_total)s ratings, <br />their average rating is %(rating_average)s"
msgstr[0] "%(display_name)s a laissé %(ratings_total)s critique, <br />sa note moyenne est %(rating_average)s"
msgstr[1] "%(display_name)s a laissé %(ratings_total)s critiques, <br />sa note moyenne est %(rating_average)s"
#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr "Son avis le mieux noté"
#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: <strong>%(rating)s</strong>"
msgstr "Sa note : <strong>%(rating)s</strong>"
#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
msgid "All the books %(display_name)s read in %(year)s"
msgstr "Tous les livres que %(display_name)s a lus en %(year)s"
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
@ -431,13 +561,6 @@ msgstr "Le chargement des données se connectera à <strong>%(source_name)s</str
msgid "Confirm"
msgstr "Confirmer"
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "de"
#: bookwyrm/templates/book/book.html:55 bookwyrm/templates/book/book.html:56
msgid "Edit Book"
msgstr "Modifier le livre"
@ -518,7 +641,7 @@ msgstr "Sujets"
msgid "Places"
msgstr "Lieux"
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:75
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:77
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -893,7 +1016,7 @@ msgstr "Communauté fédérée"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
#: bookwyrm/templates/layout.html:101
#: bookwyrm/templates/layout.html:103
msgid "Directory"
msgstr "Répertoire"
@ -913,6 +1036,8 @@ msgstr "Vous pouvez décider de ne plus y figurer à nimporte quel moment dep
#: bookwyrm/templates/directory/directory.html:29
#: bookwyrm/templates/directory/directory.html:31
#: bookwyrm/templates/feed/goal_card.html:17
#: bookwyrm/templates/feed/summary_card.html:12
#: bookwyrm/templates/feed/summary_card.html:14
#: bookwyrm/templates/snippets/announcement.html:34
msgid "Dismiss message"
msgstr "Fermer le message"
@ -1011,7 +1136,7 @@ msgstr "<a href=\"%(user_path)s\">%(username)s</a> a cité un passage de <a href
#: bookwyrm/templates/discover/discover.html:4
#: bookwyrm/templates/discover/discover.html:10
#: bookwyrm/templates/layout.html:78
#: bookwyrm/templates/layout.html:80
msgid "Discover"
msgstr "Découvrir"
@ -1128,24 +1253,24 @@ msgstr "Si vous navez pas demandé la réinitialisation de votre mot de passe
msgid "Reset your %(site_name)s password"
msgstr "Réinitialiser votre mot de passe sur %(site_name)s"
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:39
#, python-format
msgid "%(site_name)s home page"
msgstr ""
msgstr "%(site_name)s page d'accueil"
#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:232
#, python-format
msgid "About %(site_name)s"
msgstr "À propos de %(site_name)s"
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:234
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:236
msgid "Contact site admin"
msgstr "Contacter ladministrateur du site"
#: bookwyrm/templates/embed-layout.html:46
msgid "Join Bookwyrm"
msgstr ""
msgstr "Rejoignez Bookwyrm"
#: bookwyrm/templates/feed/direct_messages.html:8
#, python-format
@ -1153,7 +1278,7 @@ msgid "Direct Messages with <a href=\"%(path)s\">%(username)s</a>"
msgstr "Messages directs avec <a href=\"%(path)s\">%(username)s</a>"
#: bookwyrm/templates/feed/direct_messages.html:10
#: bookwyrm/templates/layout.html:111
#: bookwyrm/templates/layout.html:113
msgid "Direct Messages"
msgstr "Messages directs"
@ -1182,11 +1307,11 @@ msgstr "Enregistrer les réglages"
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr "charger <span data-poll=\"stream/%(tab_key)s\">0</span> statut(s) non lus"
#: bookwyrm/templates/feed/feed.html:80
#: bookwyrm/templates/feed/feed.html:86
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "Aucune activité pour linstant! Abonnezvous à quelquun pour commencer"
#: bookwyrm/templates/feed/feed.html:81
#: bookwyrm/templates/feed/feed.html:87
msgid "Alternatively, you can try enabling more status types"
msgstr "Sinon, vous pouvez essayer dactiver plus de types de statuts"
@ -1206,7 +1331,7 @@ msgstr "Vous pouvez définir ou changer votre défi lecture à nimporte quel
msgid "Updates"
msgstr "Mises à jour"
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:108
msgid "Your Books"
msgstr "Vos Livres"
@ -1260,6 +1385,15 @@ msgstr "Ne pas afficher les utilisateurs suggérés"
msgid "View directory"
msgstr "Voir le répertoire"
#: bookwyrm/templates/feed/summary_card.html:21
msgid "The end of the year is the best moment to take stock of all the books read during the last 12 months. How many pages have you read? Which book is your best-rated of the year? We compiled these stats, and more!"
msgstr "La fin de l'année est le meilleur moment pour faire le point sur tous les livres lus au cours des 12 derniers mois. Combien de pages avez-vous lues ? Quel est votre livre le mieux noté de l'année ? Nous avons compilé ces statistiques, et plus encore !"
#: bookwyrm/templates/feed/summary_card.html:26
#, python-format
msgid "Discover your stats for %(year)s!"
msgstr "Découvrez vos stats pour %(year)s !"
#: bookwyrm/templates/get_started/book_preview.html:6
#, python-format
msgid "Have you read %(book_title)s?"
@ -1274,7 +1408,7 @@ msgid "What are you reading?"
msgstr "Que lisezvous?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:138
msgid "Search for a book"
msgstr "Chercher un livre"
@ -1293,8 +1427,8 @@ msgstr "Vous pourrez ajouter des livres lorsque vous commencerez à utiliser %(s
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/group.html:19
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51
#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1505,28 +1639,28 @@ msgstr "Importer des livres"
msgid "Data source:"
msgstr "Source de données:"
#: bookwyrm/templates/import/import.html:37
#: bookwyrm/templates/import/import.html:40
msgid "Data file:"
msgstr "Fichier de données:"
#: bookwyrm/templates/import/import.html:45
#: bookwyrm/templates/import/import.html:48
msgid "Include reviews"
msgstr "Importer les critiques"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:53
msgid "Privacy setting for imported reviews:"
msgstr "Confidentialité des critiques importées:"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/settings/federation/instance_blocklist.html:64
msgid "Import"
msgstr "Importer"
#: bookwyrm/templates/import/import.html:61
#: bookwyrm/templates/import/import.html:64
msgid "Recent Imports"
msgstr "Importations récentes"
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/import/import.html:66
msgid "No recent imports"
msgstr "Aucune importation récente"
@ -1594,27 +1728,31 @@ msgstr "Titre"
msgid "ISBN"
msgstr "ISBN"
#: bookwyrm/templates/import/import_status.html:109
#: bookwyrm/templates/import/import_status.html:110
msgid "Openlibrary key"
msgstr "Clé Openlibrary"
#: bookwyrm/templates/import/import_status.html:114
#: bookwyrm/templates/shelf/shelf.html:145
#: bookwyrm/templates/shelf/shelf.html:169
msgid "Author"
msgstr "Auteur/autrice"
#: bookwyrm/templates/import/import_status.html:112
#: bookwyrm/templates/import/import_status.html:117
msgid "Shelf"
msgstr "Étagère"
#: bookwyrm/templates/import/import_status.html:115
#: bookwyrm/templates/import/import_status.html:120
#: bookwyrm/templates/import/manual_review.html:13
#: bookwyrm/templates/snippets/create_status.html:17
msgid "Review"
msgstr "Critique"
#: bookwyrm/templates/import/import_status.html:119
#: bookwyrm/templates/import/import_status.html:124
msgid "Book"
msgstr "Livre"
#: bookwyrm/templates/import/import_status.html:122
#: bookwyrm/templates/import/import_status.html:127
#: bookwyrm/templates/settings/announcements/announcements.html:38
#: bookwyrm/templates/settings/federation/instance_list.html:46
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44
@ -1624,31 +1762,31 @@ msgstr "Livre"
msgid "Status"
msgstr "Statut"
#: bookwyrm/templates/import/import_status.html:130
#: bookwyrm/templates/import/import_status.html:135
msgid "Import preview unavailable."
msgstr "Aperçu de l'importation indisponible."
#: bookwyrm/templates/import/import_status.html:162
#: bookwyrm/templates/import/import_status.html:172
msgid "View imported review"
msgstr "Afficher la critique importée"
#: bookwyrm/templates/import/import_status.html:176
#: bookwyrm/templates/import/import_status.html:186
msgid "Imported"
msgstr "Importé"
#: bookwyrm/templates/import/import_status.html:182
#: bookwyrm/templates/import/import_status.html:192
msgid "Needs manual review"
msgstr "Nécessite une vérification manuelle"
#: bookwyrm/templates/import/import_status.html:195
#: bookwyrm/templates/import/import_status.html:205
msgid "Retry"
msgstr "Réessayer"
#: bookwyrm/templates/import/import_status.html:213
#: bookwyrm/templates/import/import_status.html:223
msgid "This import is in an old format that is no longer supported. If you would like to troubleshoot missing items from this import, click the button below to update the import format."
msgstr "Cette importation est dans un ancien format qui n'est plus pris en charge. Si vous souhaitez corriger les éléments manquants de cette importation, cliquez sur le bouton ci-dessous pour mettre à jour le format d'importation."
#: bookwyrm/templates/import/import_status.html:215
#: bookwyrm/templates/import/import_status.html:225
msgid "Update import"
msgstr "Mettre à jour l'importation"
@ -1769,7 +1907,7 @@ msgid "Login"
msgstr "Connexion"
#: bookwyrm/templates/landing/login.html:7
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:179
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:181
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr "Se connecter"
@ -1778,7 +1916,7 @@ msgstr "Se connecter"
msgid "Success! Email address confirmed."
msgstr "Bravo! Ladresse email a été confirmée."
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:172
#: bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
@ -1786,12 +1924,12 @@ msgstr "Nom du compte:"
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
#: bookwyrm/templates/layout.html:174 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/layout.html:176 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/snippets/register_form.html:20
msgid "Password:"
msgstr "Mot de passe:"
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:176
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:178
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr "Mot de passe oublié?"
@ -1819,23 +1957,23 @@ msgstr "Changer de mot de passe"
msgid "%(site_name)s search"
msgstr "Recherche %(site_name)s"
#: bookwyrm/templates/layout.html:43
#: bookwyrm/templates/layout.html:45
msgid "Search for a book, user, or list"
msgstr "Rechercher un livre, un utilisateur ou une liste"
#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62
#: bookwyrm/templates/layout.html:63 bookwyrm/templates/layout.html:64
msgid "Main navigation menu"
msgstr "Menu de navigation principal "
#: bookwyrm/templates/layout.html:72
#: bookwyrm/templates/layout.html:74
msgid "Feed"
msgstr "Fil dactualité"
#: bookwyrm/templates/layout.html:116
#: bookwyrm/templates/layout.html:118
msgid "Settings"
msgstr "Paramètres"
#: bookwyrm/templates/layout.html:125
#: bookwyrm/templates/layout.html:127
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
@ -1843,46 +1981,46 @@ msgstr "Paramètres"
msgid "Invites"
msgstr "Invitations"
#: bookwyrm/templates/layout.html:132
#: bookwyrm/templates/layout.html:134
msgid "Admin"
msgstr "Admin"
#: bookwyrm/templates/layout.html:139
#: bookwyrm/templates/layout.html:141
msgid "Log out"
msgstr "Se déconnecter"
#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148
#: bookwyrm/templates/layout.html:149 bookwyrm/templates/layout.html:150
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Notifications"
#: bookwyrm/templates/layout.html:175 bookwyrm/templates/ostatus/error.html:33
#: bookwyrm/templates/layout.html:177 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr "Mot de passe"
#: bookwyrm/templates/layout.html:187
#: bookwyrm/templates/layout.html:189
msgid "Join"
msgstr "Rejoindre"
#: bookwyrm/templates/layout.html:221
#: bookwyrm/templates/layout.html:223
msgid "Successfully posted status"
msgstr "Publié !"
#: bookwyrm/templates/layout.html:222
#: bookwyrm/templates/layout.html:224
msgid "Error posting status"
msgstr "Erreur lors de la publication"
#: bookwyrm/templates/layout.html:238
#: bookwyrm/templates/layout.html:240
msgid "Documentation"
msgstr "Documentation"
#: bookwyrm/templates/layout.html:245
#: bookwyrm/templates/layout.html:247
#, python-format
msgid "Support %(site_name)s on <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a>"
msgstr "Soutenez %(site_name)s avec <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a>"
#: bookwyrm/templates/layout.html:249
#: bookwyrm/templates/layout.html:251
msgid "BookWyrm's source code is freely available. You can contribute or report issues on <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a>."
msgstr "BookWyrm est un logiciel libre. Vous pouvez contribuer ou faire des rapports de bogues via <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a>."
@ -1942,12 +2080,12 @@ msgstr "Modifier la liste"
#: bookwyrm/templates/lists/embed-list.html:7
#, python-format
msgid "%(list_name)s, a list by %(owner)s"
msgstr ""
msgstr "%(list_name)s, une liste de %(owner)s"
#: bookwyrm/templates/lists/embed-list.html:17
#, python-format
msgid "on <a href=\"/\">%(site_name)s</a>"
msgstr ""
msgstr "sur <a href=\"/\">%(site_name)s</a>"
#: bookwyrm/templates/lists/embed-list.html:26
#: bookwyrm/templates/lists/list.html:29
@ -2073,20 +2211,16 @@ msgstr "Suggérer"
#: bookwyrm/templates/lists/list.html:191
msgid "Embed this list on a website"
msgstr ""
msgstr "Intégrez cette liste sur un autre site internet"
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
msgid "Copy embed code"
msgstr ""
msgstr "Copier le code d'intégration"
#: bookwyrm/templates/lists/list.html:193
msgid "Copied!"
msgstr ""
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr ""
msgstr "%(list_name)s, une liste de %(owner)s sur %(site_name)s"
#: bookwyrm/templates/lists/list_items.html:15
msgid "Saved"
@ -4145,7 +4279,7 @@ msgstr "Ce fichier dépasse la taille limite: 10Mo"
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s (%(subtitle)s)"
#: bookwyrm/views/imports/import_data.py:64
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Fichier CSV non valide"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-08 15:40+0000\n"
"PO-Revision-Date: 2021-12-10 05:04\n"
"POT-Creation-Date: 2021-12-28 20:12+0000\n"
"PO-Revision-Date: 2021-12-29 06:07\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Galician\n"
"Language: gl\n"
@ -72,16 +72,16 @@ msgstr "Ascendente"
msgid "Descending"
msgstr "Descendente"
#: bookwyrm/importers/importer.py:141 bookwyrm/importers/importer.py:163
#: bookwyrm/importers/importer.py:145 bookwyrm/importers/importer.py:167
msgid "Error loading book"
msgstr "Erro ao cargar o libro"
#: bookwyrm/importers/importer.py:150
#: bookwyrm/importers/importer.py:154
msgid "Could not find a match for book"
msgstr "Non se atopan coincidencias para o libro"
#: bookwyrm/models/base_model.py:17
#: bookwyrm/templates/import/import_status.html:190
#: bookwyrm/templates/import/import_status.html:200
msgid "Pending"
msgstr "Pendente"
@ -144,7 +144,7 @@ msgstr "%(value)s non é un remote_id válido"
msgid "%(value)s is not a valid username"
msgstr "%(value)s non é un nome de usuaria válido"
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:173
#: bookwyrm/templates/ostatus/error.html:29
msgid "username"
msgstr "nome de usuaria"
@ -243,6 +243,136 @@ msgstr "Erro do servidor"
msgid "Something went wrong! Sorry about that."
msgstr "Algo fallou! Lamentámolo."
#: bookwyrm/templates/annual_summary/layout.html:7
#: bookwyrm/templates/feed/summary_card.html:8
#, python-format
msgid "%(year)s in the books"
msgstr "Os libros en %(year)s"
#: bookwyrm/templates/annual_summary/layout.html:43
#, python-format
msgid "%(year)s <em>in the books</em>"
msgstr "<em>os libros en </em> %(year)s"
#: bookwyrm/templates/annual_summary/layout.html:47
#, python-format
msgid "<em>%(display_name)ss</em> year of reading"
msgstr "Un ano de lecturas de <em>%(display_name)s</em>"
#: bookwyrm/templates/annual_summary/layout.html:53
msgid "Share this page"
msgstr "Comparte esta páxina"
#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr "Copiar enderezo"
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr "Copiado!"
#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: <strong>public with key</strong>"
msgstr "Compartir estado: <strong>público con chave</strong>"
#: bookwyrm/templates/annual_summary/layout.html:78
msgid "The page can be seen by anyone with the complete address."
msgstr "Esta páxina será visible para calquera que teña o enderezo completo."
#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr "Facer privada a páxina"
#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: <strong>private</strong>"
msgstr "Compartir estado: <strong>privado</strong>"
#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr "Esta páxina é privada só ti podes vela."
#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr "Facer pública a páxina"
#: bookwyrm/templates/annual_summary/layout.html:99
msgid "When you make your page private, the old key wont give access to the page anymore. A new key will be created if the page is once again made public."
msgstr "Cando fas privada unha páxina, a chave antiga non dará acceso á mesma nunca máis. Crearase unha nova chave se volves a facer pública a páxina."
#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didnt finish any book in %(year)s"
msgstr "Unha mágoa, pero %(display_name)s aínda non rematou ningún libro en %(year)s"
#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
msgid "In %(year)s, %(display_name)s read %(books_total)s book<br />for a total of %(pages_total)s pages!"
msgid_plural "In %(year)s, %(display_name)s read %(books_total)s books<br />for a total of %(pages_total)s pages!"
msgstr[0] "En %(year)s, %(display_name)s leu %(books_total)s libro<br />cun total de %(pages_total)s páxinas!"
msgstr[1] "En %(year)s, %(display_name)s leu %(books_total)s libros<br />cun total de %(pages_total)s páxinas!"
#: bookwyrm/templates/annual_summary/layout.html:124
msgid "Thats great!"
msgstr "Está moi ben!"
#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr "Esto fai unha media de %(pages)s páxinas por libro."
#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesnt have pages)"
msgid_plural "(%(no_page_number)s books dont have pages)"
msgstr[0] "(%(no_page_number)s libro non ten páxinas)"
msgstr[1] "(%(no_page_number)s libros non teñen páxinas)"
#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr "A lectura máis curta deste ano…"
#: bookwyrm/templates/annual_summary/layout.html:155
#: bookwyrm/templates/annual_summary/layout.html:176
#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "por"
#: bookwyrm/templates/annual_summary/layout.html:161
#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "<strong>%(pages)s</strong> pages"
msgstr "<strong>%(pages)s</strong> páxinas"
#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr "…e a máis longa"
#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
msgid "%(display_name)s left %(ratings_total)s rating, <br />their average rating is %(rating_average)s"
msgid_plural "%(display_name)s left %(ratings_total)s ratings, <br />their average rating is %(rating_average)s"
msgstr[0] "%(display_name)s fixo %(ratings_total)s valoración,<br />cunha media de %(rating_average)s"
msgstr[1] "%(display_name)s fixo %(ratings_total)s valoracións,<br />cunha puntuación media de %(rating_average)s"
#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr "A súa recensión máis valorada"
#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: <strong>%(rating)s</strong>"
msgstr "Valoración: <strong>%(rating)s</strong>"
#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
msgid "All the books %(display_name)s read in %(year)s"
msgstr "Tódolos libros que %(display_name)s leu en %(year)s"
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
@ -431,13 +561,6 @@ msgstr "Ao cargar os datos vas conectar con <strong>%(source_name)s</strong> e c
msgid "Confirm"
msgstr "Confirmar"
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "por"
#: bookwyrm/templates/book/book.html:55 bookwyrm/templates/book/book.html:56
msgid "Edit Book"
msgstr "Editar libro"
@ -518,7 +641,7 @@ msgstr "Temas"
msgid "Places"
msgstr "Lugares"
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:75
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:77
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -893,7 +1016,7 @@ msgstr "Comunidade federada"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
#: bookwyrm/templates/layout.html:101
#: bookwyrm/templates/layout.html:103
msgid "Directory"
msgstr "Directorio"
@ -913,6 +1036,8 @@ msgstr "Podes retirar o permiso en calquera momento nos <a href=\"%(path)s\">axu
#: bookwyrm/templates/directory/directory.html:29
#: bookwyrm/templates/directory/directory.html:31
#: bookwyrm/templates/feed/goal_card.html:17
#: bookwyrm/templates/feed/summary_card.html:12
#: bookwyrm/templates/feed/summary_card.html:14
#: bookwyrm/templates/snippets/announcement.html:34
msgid "Dismiss message"
msgstr "Desbotar mensaxe"
@ -1011,7 +1136,7 @@ msgstr "<a href=\"%(user_path)s\">%(username)s</a> citou <a href=\"%(book_path)s
#: bookwyrm/templates/discover/discover.html:4
#: bookwyrm/templates/discover/discover.html:10
#: bookwyrm/templates/layout.html:78
#: bookwyrm/templates/layout.html:80
msgid "Discover"
msgstr "Descubrir"
@ -1128,18 +1253,18 @@ msgstr "Se non solicitaches cambiar o contrasinal podes ignorar este email."
msgid "Reset your %(site_name)s password"
msgstr "Restablece o contrasinal en %(site_name)s"
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:39
#, python-format
msgid "%(site_name)s home page"
msgstr "Páxina de inicio de %(site_name)s"
#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:232
#, python-format
msgid "About %(site_name)s"
msgstr "Acerca de %(site_name)s"
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:234
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:236
msgid "Contact site admin"
msgstr "Contacta coa administración"
@ -1153,7 +1278,7 @@ msgid "Direct Messages with <a href=\"%(path)s\">%(username)s</a>"
msgstr "Mensaxes Directas con <a href=\"%(path)s\">%(username)s</a>"
#: bookwyrm/templates/feed/direct_messages.html:10
#: bookwyrm/templates/layout.html:111
#: bookwyrm/templates/layout.html:113
msgid "Direct Messages"
msgstr "Mensaxes Directas"
@ -1182,11 +1307,11 @@ msgstr "Gardar axustes"
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr "cargar <span data-poll=\"stream/%(tab_key)s\">0</span> estado(s) non lidos"
#: bookwyrm/templates/feed/feed.html:80
#: bookwyrm/templates/feed/feed.html:86
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "Non hai actividade por agora! Proba a seguir algunha persoa para comezar"
#: bookwyrm/templates/feed/feed.html:81
#: bookwyrm/templates/feed/feed.html:87
msgid "Alternatively, you can try enabling more status types"
msgstr "De xeito alternativo, podes activar máis tipos de estados"
@ -1206,7 +1331,7 @@ msgstr "Podes establecer ou cambiar un obxectivo de lectura en calquera momento
msgid "Updates"
msgstr "Actualizacións"
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:108
msgid "Your Books"
msgstr "Os teus libros"
@ -1260,6 +1385,15 @@ msgstr "Non mostrar suxestións"
msgid "View directory"
msgstr "Ver directorio"
#: bookwyrm/templates/feed/summary_card.html:21
msgid "The end of the year is the best moment to take stock of all the books read during the last 12 months. How many pages have you read? Which book is your best-rated of the year? We compiled these stats, and more!"
msgstr "O final do ano é o mellor momento para botar unha ollada a tódolos libros lidos nos últimos 12 meses. Cantas páxinas liches? Cal é o libro con mellor puntuación do ano? Recollemos estas estatísticas e moitas máis!"
#: bookwyrm/templates/feed/summary_card.html:26
#, python-format
msgid "Discover your stats for %(year)s!"
msgstr "Mira aquí as túas estatísticas de %(year)s!"
#: bookwyrm/templates/get_started/book_preview.html:6
#, python-format
msgid "Have you read %(book_title)s?"
@ -1274,7 +1408,7 @@ msgid "What are you reading?"
msgstr "Que estás a ler?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:138
msgid "Search for a book"
msgstr "Buscar un libro"
@ -1293,8 +1427,8 @@ msgstr "Podes engadir libros cando comeces a usar %(site_name)s."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/group.html:19
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51
#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1505,28 +1639,28 @@ msgstr "Importar libros"
msgid "Data source:"
msgstr "Fonte de datos:"
#: bookwyrm/templates/import/import.html:37
#: bookwyrm/templates/import/import.html:40
msgid "Data file:"
msgstr "Ficheiro de datos:"
#: bookwyrm/templates/import/import.html:45
#: bookwyrm/templates/import/import.html:48
msgid "Include reviews"
msgstr "Incluír recensións"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:53
msgid "Privacy setting for imported reviews:"
msgstr "Axuste de privacidade para recensións importadas:"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/settings/federation/instance_blocklist.html:64
msgid "Import"
msgstr "Importar"
#: bookwyrm/templates/import/import.html:61
#: bookwyrm/templates/import/import.html:64
msgid "Recent Imports"
msgstr "Importacións recentes"
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/import/import.html:66
msgid "No recent imports"
msgstr "Sen importacións recentes"
@ -1594,27 +1728,31 @@ msgstr "Título"
msgid "ISBN"
msgstr "ISBN"
#: bookwyrm/templates/import/import_status.html:109
#: bookwyrm/templates/import/import_status.html:110
msgid "Openlibrary key"
msgstr "Chave en Openlibrary"
#: bookwyrm/templates/import/import_status.html:114
#: bookwyrm/templates/shelf/shelf.html:145
#: bookwyrm/templates/shelf/shelf.html:169
msgid "Author"
msgstr "Autor"
#: bookwyrm/templates/import/import_status.html:112
#: bookwyrm/templates/import/import_status.html:117
msgid "Shelf"
msgstr "Estante"
#: bookwyrm/templates/import/import_status.html:115
#: bookwyrm/templates/import/import_status.html:120
#: bookwyrm/templates/import/manual_review.html:13
#: bookwyrm/templates/snippets/create_status.html:17
msgid "Review"
msgstr "Revisar"
#: bookwyrm/templates/import/import_status.html:119
#: bookwyrm/templates/import/import_status.html:124
msgid "Book"
msgstr "Libro"
#: bookwyrm/templates/import/import_status.html:122
#: bookwyrm/templates/import/import_status.html:127
#: bookwyrm/templates/settings/announcements/announcements.html:38
#: bookwyrm/templates/settings/federation/instance_list.html:46
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44
@ -1624,31 +1762,31 @@ msgstr "Libro"
msgid "Status"
msgstr "Estado"
#: bookwyrm/templates/import/import_status.html:130
#: bookwyrm/templates/import/import_status.html:135
msgid "Import preview unavailable."
msgstr "Non dispoñible vista previa da importación."
#: bookwyrm/templates/import/import_status.html:162
#: bookwyrm/templates/import/import_status.html:172
msgid "View imported review"
msgstr "Ver revisión importada"
#: bookwyrm/templates/import/import_status.html:176
#: bookwyrm/templates/import/import_status.html:186
msgid "Imported"
msgstr "Importado"
#: bookwyrm/templates/import/import_status.html:182
#: bookwyrm/templates/import/import_status.html:192
msgid "Needs manual review"
msgstr "Precisa revisión manual"
#: bookwyrm/templates/import/import_status.html:195
#: bookwyrm/templates/import/import_status.html:205
msgid "Retry"
msgstr "Volver a intentar"
#: bookwyrm/templates/import/import_status.html:213
#: bookwyrm/templates/import/import_status.html:223
msgid "This import is in an old format that is no longer supported. If you would like to troubleshoot missing items from this import, click the button below to update the import format."
msgstr "Esta importación ten un formato antigo xa non soportado. Se queres intentar recuperar os elementos que faltan nesta importación preme no botón inferior para actualizar o formato de importación."
#: bookwyrm/templates/import/import_status.html:215
#: bookwyrm/templates/import/import_status.html:225
msgid "Update import"
msgstr "Actualizar importación"
@ -1769,7 +1907,7 @@ msgid "Login"
msgstr "Conectar"
#: bookwyrm/templates/landing/login.html:7
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:179
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:181
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr "Conecta"
@ -1778,7 +1916,7 @@ msgstr "Conecta"
msgid "Success! Email address confirmed."
msgstr "Correcto! Enderezo de email confirmado."
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:172
#: bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
@ -1786,12 +1924,12 @@ msgstr "Nome de usuaria:"
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
#: bookwyrm/templates/layout.html:174 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/layout.html:176 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/snippets/register_form.html:20
msgid "Password:"
msgstr "Contrasinal:"
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:176
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:178
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr "Esqueceches o contrasinal?"
@ -1819,23 +1957,23 @@ msgstr "Restablecer contrasinal"
msgid "%(site_name)s search"
msgstr "Busca en %(site_name)s"
#: bookwyrm/templates/layout.html:43
#: bookwyrm/templates/layout.html:45
msgid "Search for a book, user, or list"
msgstr "Busca un libro, usuaria ou lista"
#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62
#: bookwyrm/templates/layout.html:63 bookwyrm/templates/layout.html:64
msgid "Main navigation menu"
msgstr "Menú principal de navegación"
#: bookwyrm/templates/layout.html:72
#: bookwyrm/templates/layout.html:74
msgid "Feed"
msgstr "Fonte"
#: bookwyrm/templates/layout.html:116
#: bookwyrm/templates/layout.html:118
msgid "Settings"
msgstr "Axustes"
#: bookwyrm/templates/layout.html:125
#: bookwyrm/templates/layout.html:127
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
@ -1843,46 +1981,46 @@ msgstr "Axustes"
msgid "Invites"
msgstr "Convites"
#: bookwyrm/templates/layout.html:132
#: bookwyrm/templates/layout.html:134
msgid "Admin"
msgstr "Admin"
#: bookwyrm/templates/layout.html:139
#: bookwyrm/templates/layout.html:141
msgid "Log out"
msgstr "Desconectar"
#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148
#: bookwyrm/templates/layout.html:149 bookwyrm/templates/layout.html:150
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Notificacións"
#: bookwyrm/templates/layout.html:175 bookwyrm/templates/ostatus/error.html:33
#: bookwyrm/templates/layout.html:177 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr "contrasinal"
#: bookwyrm/templates/layout.html:187
#: bookwyrm/templates/layout.html:189
msgid "Join"
msgstr "Únete"
#: bookwyrm/templates/layout.html:221
#: bookwyrm/templates/layout.html:223
msgid "Successfully posted status"
msgstr "Publicación correcta"
#: bookwyrm/templates/layout.html:222
#: bookwyrm/templates/layout.html:224
msgid "Error posting status"
msgstr "Erro ao publicar"
#: bookwyrm/templates/layout.html:238
#: bookwyrm/templates/layout.html:240
msgid "Documentation"
msgstr "Documentación"
#: bookwyrm/templates/layout.html:245
#: bookwyrm/templates/layout.html:247
#, python-format
msgid "Support %(site_name)s on <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a>"
msgstr "Axuda a %(site_name)s en <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a>"
#: bookwyrm/templates/layout.html:249
#: bookwyrm/templates/layout.html:251
msgid "BookWyrm's source code is freely available. You can contribute or report issues on <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a>."
msgstr "O código fonte de BookWyrm é público. Podes colaborar ou informar de problemas en <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a>."
@ -2075,15 +2213,11 @@ msgstr "Suxire"
msgid "Embed this list on a website"
msgstr "Utiliza esta lista nunha páxina web"
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
msgid "Copy embed code"
msgstr "Copia o código a incluír"
#: bookwyrm/templates/lists/list.html:193
msgid "Copied!"
msgstr "Copiado!"
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
#, 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"
@ -4145,7 +4279,7 @@ msgstr "O ficheiro supera o tamaño máximo: 10MB"
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/imports/import_data.py:64
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Non é un ficheiro csv válido"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-08 15:40+0000\n"
"PO-Revision-Date: 2021-12-13 20:56\n"
"POT-Creation-Date: 2021-12-28 20:12+0000\n"
"PO-Revision-Date: 2021-12-28 21:17\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Lithuanian\n"
"Language: lt\n"
@ -72,16 +72,16 @@ msgstr "Didėjančia tvarka"
msgid "Descending"
msgstr "Mažėjančia tvarka"
#: bookwyrm/importers/importer.py:141 bookwyrm/importers/importer.py:163
#: bookwyrm/importers/importer.py:145 bookwyrm/importers/importer.py:167
msgid "Error loading book"
msgstr "Klaida įkeliant knygą"
#: bookwyrm/importers/importer.py:150
#: bookwyrm/importers/importer.py:154
msgid "Could not find a match for book"
msgstr "Nepavyko rasti tokios knygos"
#: bookwyrm/models/base_model.py:17
#: bookwyrm/templates/import/import_status.html:190
#: bookwyrm/templates/import/import_status.html:200
msgid "Pending"
msgstr "Laukiama"
@ -144,7 +144,7 @@ msgstr "%(value)s yra negaliojantis remote_id"
msgid "%(value)s is not a valid username"
msgstr "%(value)s yra negaliojantis naudotojo vardas"
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:173
#: bookwyrm/templates/ostatus/error.html:29
msgid "username"
msgstr "naudotojo vardas"
@ -243,6 +243,142 @@ msgstr "Serverio klaida"
msgid "Something went wrong! Sorry about that."
msgstr "Kažkas nepavyko. Atsiprašome."
#: bookwyrm/templates/annual_summary/layout.html:7
#: bookwyrm/templates/feed/summary_card.html:8
#, python-format
msgid "%(year)s in the books"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:43
#, python-format
msgid "%(year)s <em>in the books</em>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:47
#, python-format
msgid "<em>%(display_name)ss</em> year of reading"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:53
msgid "Share this page"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr "Nukopijuota"
#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: <strong>public with key</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:78
msgid "The page can be seen by anyone with the complete address."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: <strong>private</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:99
msgid "When you make your page private, the old key wont give access to the page anymore. A new key will be created if the page is once again made public."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didnt finish any book in %(year)s"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
msgid "In %(year)s, %(display_name)s read %(books_total)s book<br />for a total of %(pages_total)s pages!"
msgid_plural "In %(year)s, %(display_name)s read %(books_total)s books<br />for a total of %(pages_total)s pages!"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
#: bookwyrm/templates/annual_summary/layout.html:124
msgid "Thats great!"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesnt have pages)"
msgid_plural "(%(no_page_number)s books dont have pages)"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:155
#: bookwyrm/templates/annual_summary/layout.html:176
#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr " "
#: bookwyrm/templates/annual_summary/layout.html:161
#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "<strong>%(pages)s</strong> pages"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
msgid "%(display_name)s left %(ratings_total)s rating, <br />their average rating is %(rating_average)s"
msgid_plural "%(display_name)s left %(ratings_total)s ratings, <br />their average rating is %(rating_average)s"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: <strong>%(rating)s</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
msgid "All the books %(display_name)s read in %(year)s"
msgstr ""
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
@ -250,7 +386,7 @@ msgstr "Keisti autorių"
#: bookwyrm/templates/author/author.html:40
msgid "Author details"
msgstr ""
msgstr "Informacija apie autorių"
#: bookwyrm/templates/author/author.html:44
#: bookwyrm/templates/author/edit_author.html:42
@ -267,7 +403,7 @@ msgstr "Mirė:"
#: bookwyrm/templates/author/author.html:70
msgid "External links"
msgstr ""
msgstr "Išorinės nuorodos"
#: bookwyrm/templates/author/author.html:75
msgid "Wikipedia"
@ -282,7 +418,7 @@ msgstr "Peržiūrėti ISNI įrašą"
#: bookwyrm/templates/book/book.html:93
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr ""
msgstr "Įkelti duomenis"
#: bookwyrm/templates/author/author.html:92
#: bookwyrm/templates/book/book.html:96
@ -420,7 +556,7 @@ msgstr "Atšaukti"
#: bookwyrm/templates/author/sync_modal.html:15
#, python-format
msgid "Loading data will connect to <strong>%(source_name)s</strong> and check for any metadata about this author which aren't present here. Existing metadata will not be overwritten."
msgstr ""
msgstr "Duomenų įkėlimas prisijungs prie <strong>%(source_name)s</strong> ir patikrins ar nėra naujos informacijos. Esantys metaduomenys nebus perrašomi."
#: bookwyrm/templates/author/sync_modal.html:23
#: bookwyrm/templates/book/edit/edit_book.html:108
@ -431,13 +567,6 @@ msgstr ""
msgid "Confirm"
msgstr "Patvirtinti"
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr " "
#: bookwyrm/templates/book/book.html:55 bookwyrm/templates/book/book.html:56
msgid "Edit Book"
msgstr "Redaguoti knygą"
@ -520,7 +649,7 @@ msgstr "Temos"
msgid "Places"
msgstr "Vietos"
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:75
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:77
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -812,7 +941,7 @@ msgstr "Ištrinti šias skaitymo datas"
#: bookwyrm/templates/book/sync_modal.html:15
#, python-format
msgid "Loading data will connect to <strong>%(source_name)s</strong> and check for any metadata about this book which aren't present here. Existing metadata will not be overwritten."
msgstr ""
msgstr "Duomenų įkėlimas prisijungs prie <strong>%(source_name)s</strong> ir patikrins ar nėra naujos informacijos apie šią knygą. Esantys metaduomenys nebus perrašomi."
#: bookwyrm/templates/components/inline_form.html:8
#: bookwyrm/templates/components/modal.html:11
@ -895,7 +1024,7 @@ msgstr "Sujungta bendruomenė"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
#: bookwyrm/templates/layout.html:101
#: bookwyrm/templates/layout.html:103
msgid "Directory"
msgstr "Bendruomenė"
@ -915,6 +1044,8 @@ msgstr "Tai galite visada atšaukti <a href=\"%(path)s\">paskyros nustatymuose.<
#: bookwyrm/templates/directory/directory.html:29
#: bookwyrm/templates/directory/directory.html:31
#: bookwyrm/templates/feed/goal_card.html:17
#: bookwyrm/templates/feed/summary_card.html:12
#: bookwyrm/templates/feed/summary_card.html:14
#: bookwyrm/templates/snippets/announcement.html:34
msgid "Dismiss message"
msgstr "Pašalinti pranešimą"
@ -1017,7 +1148,7 @@ msgstr "<a href=\"%(user_path)s\">%(username)s</a> citavo <a href=\"%(book_path)
#: bookwyrm/templates/discover/discover.html:4
#: bookwyrm/templates/discover/discover.html:10
#: bookwyrm/templates/layout.html:78
#: bookwyrm/templates/layout.html:80
msgid "Discover"
msgstr "Atraskite"
@ -1134,18 +1265,18 @@ msgstr "Jei nenorite pakeisti savo slaptažodžio - ignoruokite šį laišką."
msgid "Reset your %(site_name)s password"
msgstr "Keisti %(site_name)s slaptažodį"
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:39
#, python-format
msgid "%(site_name)s home page"
msgstr "%(site_name)s pagrindinis puslapis"
#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:232
#, python-format
msgid "About %(site_name)s"
msgstr "Apie %(site_name)s"
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:234
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:236
msgid "Contact site admin"
msgstr "Puslapio administratorius"
@ -1159,7 +1290,7 @@ msgid "Direct Messages with <a href=\"%(path)s\">%(username)s</a>"
msgstr "Asmeninis susirašinėjimas su <a href=\"%(path)s\">%(username)s</a>"
#: bookwyrm/templates/feed/direct_messages.html:10
#: bookwyrm/templates/layout.html:111
#: bookwyrm/templates/layout.html:113
msgid "Direct Messages"
msgstr "Asmeninės žinutės"
@ -1188,11 +1319,11 @@ msgstr "Išsaugoti nustatymus"
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr "įkelti <span data-poll=\"stream/%(tab_key)s\">0</span> neperskaitytų būsena"
#: bookwyrm/templates/feed/feed.html:80
#: bookwyrm/templates/feed/feed.html:86
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "Šiuo metu įrašų nėra. Norėdami matyti, sekite narį."
#: bookwyrm/templates/feed/feed.html:81
#: bookwyrm/templates/feed/feed.html:87
msgid "Alternatively, you can try enabling more status types"
msgstr "Taip pat galite pasirinkti daugiau būsenos tipų"
@ -1212,7 +1343,7 @@ msgstr "Bet kuriuo metu galite pakeisti savo skaitymo tikslą savo <a href=\"%(p
msgid "Updates"
msgstr "Atnaujinimai"
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:108
msgid "Your Books"
msgstr "Jūsų knygos"
@ -1266,6 +1397,15 @@ msgstr "Nerodyti siūlomų vartotojų"
msgid "View directory"
msgstr "Žiūrėti katalogą"
#: bookwyrm/templates/feed/summary_card.html:21
msgid "The end of the year is the best moment to take stock of all the books read during the last 12 months. How many pages have you read? Which book is your best-rated of the year? We compiled these stats, and more!"
msgstr ""
#: bookwyrm/templates/feed/summary_card.html:26
#, python-format
msgid "Discover your stats for %(year)s!"
msgstr ""
#: bookwyrm/templates/get_started/book_preview.html:6
#, python-format
msgid "Have you read %(book_title)s?"
@ -1280,7 +1420,7 @@ msgid "What are you reading?"
msgstr "Ką skaitome?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:138
msgid "Search for a book"
msgstr "Ieškoti knygos"
@ -1299,8 +1439,8 @@ msgstr "Kai pradedate naudotis %(site_name)s, galite pridėti knygų."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/group.html:19
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51
#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1515,28 +1655,28 @@ msgstr "Importuoti knygas"
msgid "Data source:"
msgstr "Duomenų šaltinis:"
#: bookwyrm/templates/import/import.html:37
#: bookwyrm/templates/import/import.html:40
msgid "Data file:"
msgstr "Duomenų failas:"
#: bookwyrm/templates/import/import.html:45
#: bookwyrm/templates/import/import.html:48
msgid "Include reviews"
msgstr "Įtraukti atsiliepimus"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:53
msgid "Privacy setting for imported reviews:"
msgstr "Privatumo nustatymai svarbiems atsiliepimams:"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/settings/federation/instance_blocklist.html:64
msgid "Import"
msgstr "Importuoti"
#: bookwyrm/templates/import/import.html:61
#: bookwyrm/templates/import/import.html:64
msgid "Recent Imports"
msgstr "Pastaruoju metu importuota"
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/import/import.html:66
msgid "No recent imports"
msgstr "Pastaruoju metu neimportuota"
@ -1608,27 +1748,31 @@ msgstr "Pavadinimas"
msgid "ISBN"
msgstr "ISBN"
#: bookwyrm/templates/import/import_status.html:109
#: bookwyrm/templates/import/import_status.html:110
msgid "Openlibrary key"
msgstr "„Openlibrary“ raktas"
#: bookwyrm/templates/import/import_status.html:114
#: bookwyrm/templates/shelf/shelf.html:145
#: bookwyrm/templates/shelf/shelf.html:169
msgid "Author"
msgstr "Autorius"
#: bookwyrm/templates/import/import_status.html:112
#: bookwyrm/templates/import/import_status.html:117
msgid "Shelf"
msgstr "Lentyna"
#: bookwyrm/templates/import/import_status.html:115
#: bookwyrm/templates/import/import_status.html:120
#: bookwyrm/templates/import/manual_review.html:13
#: bookwyrm/templates/snippets/create_status.html:17
msgid "Review"
msgstr "Apžvalga"
#: bookwyrm/templates/import/import_status.html:119
#: bookwyrm/templates/import/import_status.html:124
msgid "Book"
msgstr "Knyga"
#: bookwyrm/templates/import/import_status.html:122
#: bookwyrm/templates/import/import_status.html:127
#: bookwyrm/templates/settings/announcements/announcements.html:38
#: bookwyrm/templates/settings/federation/instance_list.html:46
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44
@ -1638,31 +1782,31 @@ msgstr "Knyga"
msgid "Status"
msgstr "Būsena"
#: bookwyrm/templates/import/import_status.html:130
#: bookwyrm/templates/import/import_status.html:135
msgid "Import preview unavailable."
msgstr "Nepavyko įkelti peržiūros."
#: bookwyrm/templates/import/import_status.html:162
#: bookwyrm/templates/import/import_status.html:172
msgid "View imported review"
msgstr "Peržiūrėti įkeltą atsiliepimą"
#: bookwyrm/templates/import/import_status.html:176
#: bookwyrm/templates/import/import_status.html:186
msgid "Imported"
msgstr "Importuota"
#: bookwyrm/templates/import/import_status.html:182
#: bookwyrm/templates/import/import_status.html:192
msgid "Needs manual review"
msgstr "Reikalinga peržvelgti"
#: bookwyrm/templates/import/import_status.html:195
#: bookwyrm/templates/import/import_status.html:205
msgid "Retry"
msgstr "Bandyti dar kartą"
#: bookwyrm/templates/import/import_status.html:213
#: bookwyrm/templates/import/import_status.html:223
msgid "This import is in an old format that is no longer supported. If you would like to troubleshoot missing items from this import, click the button below to update the import format."
msgstr "Tai seno formato importas, kuris nebepalaikomas. Jei norite matyti importo metu praleistus elementus, spustelėkite žemiau esantį mygtuką ir atnaujinkite importavimo formatą."
#: bookwyrm/templates/import/import_status.html:215
#: bookwyrm/templates/import/import_status.html:225
msgid "Update import"
msgstr "Atnaujinti importą"
@ -1783,7 +1927,7 @@ msgid "Login"
msgstr "Prisijungti"
#: bookwyrm/templates/landing/login.html:7
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:179
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:181
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr "Prisijunkite"
@ -1792,7 +1936,7 @@ msgstr "Prisijunkite"
msgid "Success! Email address confirmed."
msgstr "Džiugu, el. pašto adresas patvirtintas."
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:172
#: bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
@ -1800,12 +1944,12 @@ msgstr "Naudotojo vardas:"
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
#: bookwyrm/templates/layout.html:174 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/layout.html:176 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/snippets/register_form.html:20
msgid "Password:"
msgstr "Slaptažodis:"
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:176
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:178
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr "Pamiršote slaptažodį?"
@ -1833,23 +1977,23 @@ msgstr "Atstatyti slaptažodį"
msgid "%(site_name)s search"
msgstr "%(site_name)s paieška"
#: bookwyrm/templates/layout.html:43
#: bookwyrm/templates/layout.html:45
msgid "Search for a book, user, or list"
msgstr "Ieškoti knygos, naudotojo arba sąrašo"
#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62
#: bookwyrm/templates/layout.html:63 bookwyrm/templates/layout.html:64
msgid "Main navigation menu"
msgstr "Pagrindinis navigacijos meniu"
#: bookwyrm/templates/layout.html:72
#: bookwyrm/templates/layout.html:74
msgid "Feed"
msgstr "Srautas"
#: bookwyrm/templates/layout.html:116
#: bookwyrm/templates/layout.html:118
msgid "Settings"
msgstr "Nustatymai"
#: bookwyrm/templates/layout.html:125
#: bookwyrm/templates/layout.html:127
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
@ -1857,46 +2001,46 @@ msgstr "Nustatymai"
msgid "Invites"
msgstr "Pakvietimai"
#: bookwyrm/templates/layout.html:132
#: bookwyrm/templates/layout.html:134
msgid "Admin"
msgstr "Administravimas"
#: bookwyrm/templates/layout.html:139
#: bookwyrm/templates/layout.html:141
msgid "Log out"
msgstr "Atsijungti"
#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148
#: bookwyrm/templates/layout.html:149 bookwyrm/templates/layout.html:150
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Pranešimai"
#: bookwyrm/templates/layout.html:175 bookwyrm/templates/ostatus/error.html:33
#: bookwyrm/templates/layout.html:177 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr "slaptažodis"
#: bookwyrm/templates/layout.html:187
#: bookwyrm/templates/layout.html:189
msgid "Join"
msgstr "Prisijungti"
#: bookwyrm/templates/layout.html:221
#: bookwyrm/templates/layout.html:223
msgid "Successfully posted status"
msgstr "Būsena publikuota sėkmingai"
#: bookwyrm/templates/layout.html:222
#: bookwyrm/templates/layout.html:224
msgid "Error posting status"
msgstr "Klaida, publikuojant būseną"
#: bookwyrm/templates/layout.html:238
#: bookwyrm/templates/layout.html:240
msgid "Documentation"
msgstr "Dokumentacija"
#: bookwyrm/templates/layout.html:245
#: bookwyrm/templates/layout.html:247
#, python-format
msgid "Support %(site_name)s on <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a>"
msgstr "Paremkite %(site_name)s per <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a>"
#: bookwyrm/templates/layout.html:249
#: bookwyrm/templates/layout.html:251
msgid "BookWyrm's source code is freely available. You can contribute or report issues on <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a>."
msgstr "„BookWyrm“ šaltinio kodas yra laisvai prieinamas. Galite prisidėti arba pranešti apie klaidas per <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a>."
@ -2089,15 +2233,11 @@ msgstr "Siūlyti"
msgid "Embed this list on a website"
msgstr "Įdėkite šį sąrašą į tinklalapį"
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
msgid "Copy embed code"
msgstr "Nukopijuokite įterptinį kodą"
#: bookwyrm/templates/lists/list.html:193
msgid "Copied!"
msgstr "Nukopijuota"
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
#, 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"
@ -2136,22 +2276,22 @@ msgstr "į sąrašą „<a href=\"%(list_path)s\">%(list_name)s</a>\" patariama
#: bookwyrm/templates/notifications/items/boost.html:19
#, python-format
msgid "boosted your <a href=\"%(related_path)s\">review of <em>%(book_title)s</em></a>"
msgstr "populiarėja <a href=\"%(related_path)s\">jūsų atsiliepimas apie <em>%(book_title)s</em></a>"
msgstr "populiarino <a href=\"%(related_path)s\">jūsų atsiliepimą apie <em>%(book_title)s</em></a>"
#: bookwyrm/templates/notifications/items/boost.html:25
#, python-format
msgid "boosted your <a href=\"%(related_path)s\">comment on<em>%(book_title)s</em></a>"
msgstr "populiarėja <a href=\"%(related_path)s\">jūsų komentaras apie <em>%(book_title)s</em></a>"
msgstr "populiarino <a href=\"%(related_path)s\">jūsų komentarą apie <em>%(book_title)s</em></a>"
#: bookwyrm/templates/notifications/items/boost.html:31
#, python-format
msgid "boosted your <a href=\"%(related_path)s\">quote from <em>%(book_title)s</em></a>"
msgstr "populiarėja <a href=\"%(related_path)s\">jūsų citata iš <em>%(book_title)s</em></a>"
msgstr "populiarino <a href=\"%(related_path)s\">jūsų citatą iš <em>%(book_title)s</em></a>"
#: bookwyrm/templates/notifications/items/boost.html:37
#, python-format
msgid "boosted your <a href=\"%(related_path)s\">status</a>"
msgstr "populiarėja jūsų <a href=\"%(related_path)s\">būsena</a>"
msgstr "populiarino jūsų <a href=\"%(related_path)s\">būseną</a>"
#: bookwyrm/templates/notifications/items/fav.html:19
#, python-format
@ -4183,7 +4323,7 @@ msgstr "Failas viršijo maksimalų dydį: 10 MB"
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/imports/import_data.py:64
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Netinkamas csv failas"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-08 15:40+0000\n"
"PO-Revision-Date: 2021-12-11 15:41\n"
"POT-Creation-Date: 2021-12-28 20:12+0000\n"
"PO-Revision-Date: 2021-12-29 00:08\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt\n"
@ -72,16 +72,16 @@ msgstr "Crescente"
msgid "Descending"
msgstr "Decrescente"
#: bookwyrm/importers/importer.py:141 bookwyrm/importers/importer.py:163
#: bookwyrm/importers/importer.py:145 bookwyrm/importers/importer.py:167
msgid "Error loading book"
msgstr "Erro ao carregar livro"
#: bookwyrm/importers/importer.py:150
#: bookwyrm/importers/importer.py:154
msgid "Could not find a match for book"
msgstr "Não foi possível encontrar o livro"
#: bookwyrm/models/base_model.py:17
#: bookwyrm/templates/import/import_status.html:190
#: bookwyrm/templates/import/import_status.html:200
msgid "Pending"
msgstr "Pendente"
@ -144,7 +144,7 @@ msgstr "%(value)s não é um remote_id válido"
msgid "%(value)s is not a valid username"
msgstr "%(value)s não é um nome de usuário válido"
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:173
#: bookwyrm/templates/ostatus/error.html:29
msgid "username"
msgstr "nome de usuário"
@ -243,6 +243,136 @@ msgstr "Erro no servidor"
msgid "Something went wrong! Sorry about that."
msgstr "Algo deu errado! Foi mal."
#: bookwyrm/templates/annual_summary/layout.html:7
#: bookwyrm/templates/feed/summary_card.html:8
#, python-format
msgid "%(year)s in the books"
msgstr "Os livros de %(year)s"
#: bookwyrm/templates/annual_summary/layout.html:43
#, python-format
msgid "%(year)s <em>in the books</em>"
msgstr "<em>Os livros de</em> %(year)s"
#: bookwyrm/templates/annual_summary/layout.html:47
#, python-format
msgid "<em>%(display_name)ss</em> year of reading"
msgstr "O ano de leitura de <em>%(display_name)s</em>"
#: bookwyrm/templates/annual_summary/layout.html:53
msgid "Share this page"
msgstr "Compartilhe esta página"
#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr "Copiar endereço"
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr "Copiado!"
#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: <strong>public with key</strong>"
msgstr "Compartilhamento: <strong>público com chave</strong>"
#: bookwyrm/templates/annual_summary/layout.html:78
msgid "The page can be seen by anyone with the complete address."
msgstr "Esta página pode ser vista por qualquer pessoa que tenha seu link."
#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr "Tornar a página particular"
#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: <strong>private</strong>"
msgstr "Compartilhamento: <strong>particular</strong>"
#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr "A página é particular, só você pode vê-la."
#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr "Tornar a página pública"
#: bookwyrm/templates/annual_summary/layout.html:99
msgid "When you make your page private, the old key wont give access to the page anymore. A new key will be created if the page is once again made public."
msgstr "Ao tornar a página particular, a chave antiga passa a não funcionar mais. Uma nova chave será gerada quando a página for tornada pública novamente."
#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didnt finish any book in %(year)s"
msgstr "Infelizmente %(display_name)s não terminou nenhum livro em %(year)s"
#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
msgid "In %(year)s, %(display_name)s read %(books_total)s book<br />for a total of %(pages_total)s pages!"
msgid_plural "In %(year)s, %(display_name)s read %(books_total)s books<br />for a total of %(pages_total)s pages!"
msgstr[0] "Em %(year)s, %(display_name)s leu %(books_total)s livro,<br />um total de %(pages_total)s páginas!"
msgstr[1] "Em %(year)s, %(display_name)s leu %(books_total)s livros,<br />um total de %(pages_total)s páginas!"
#: bookwyrm/templates/annual_summary/layout.html:124
msgid "Thats great!"
msgstr "Muito legal!"
#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr "Isso dá uma média de %(pages)s páginas por livro."
#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesnt have pages)"
msgid_plural "(%(no_page_number)s books dont have pages)"
msgstr[0] "(%(no_page_number)s livro não tem páginas cadastradas)"
msgstr[1] "(%(no_page_number)s livros não têm páginas cadastradas)"
#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr "A leitura mais curta do ano…"
#: bookwyrm/templates/annual_summary/layout.html:155
#: bookwyrm/templates/annual_summary/layout.html:176
#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "de"
#: bookwyrm/templates/annual_summary/layout.html:161
#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "<strong>%(pages)s</strong> pages"
msgstr "<strong>%(pages)s</strong> páginas"
#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr "…e a mais longa"
#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
msgid "%(display_name)s left %(ratings_total)s rating, <br />their average rating is %(rating_average)s"
msgid_plural "%(display_name)s left %(ratings_total)s ratings, <br />their average rating is %(rating_average)s"
msgstr[0] "%(display_name)s fez %(ratings_total)s avaliação, <br />com uma média de %(rating_average)s"
msgstr[1] "%(display_name)s fez %(ratings_total)s avaliações, <br />com uma média de %(rating_average)s"
#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr "Sua melhor avaliação"
#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: <strong>%(rating)s</strong>"
msgstr "Avaliação: <strong>%(rating)s</strong>"
#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
msgid "All the books %(display_name)s read in %(year)s"
msgstr "Todos os livros lidos por %(display_name)s em %(year)s"
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
@ -431,13 +561,6 @@ msgstr "Para carregar informações nos conectaremos a <strong>%(source_name)s</
msgid "Confirm"
msgstr "Confirmar"
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "de"
#: bookwyrm/templates/book/book.html:55 bookwyrm/templates/book/book.html:56
msgid "Edit Book"
msgstr "Editar livro"
@ -496,7 +619,7 @@ msgstr "Criar"
#: bookwyrm/templates/book/book.html:223
msgid "You don't have any reading activity for this book."
msgstr "Você ainda não registrou nenhuma atividade neste livro."
msgstr "Você ainda não registrou sua leitura."
#: bookwyrm/templates/book/book.html:249
msgid "Your reviews"
@ -518,7 +641,7 @@ msgstr "Assuntos"
msgid "Places"
msgstr "Lugares"
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:75
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:77
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -893,7 +1016,7 @@ msgstr "Comunidade federada"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
#: bookwyrm/templates/layout.html:101
#: bookwyrm/templates/layout.html:103
msgid "Directory"
msgstr "Diretório"
@ -913,6 +1036,8 @@ msgstr "Você pode desabilitar esta opção a qualquer momento em suas <a href=\
#: bookwyrm/templates/directory/directory.html:29
#: bookwyrm/templates/directory/directory.html:31
#: bookwyrm/templates/feed/goal_card.html:17
#: bookwyrm/templates/feed/summary_card.html:12
#: bookwyrm/templates/feed/summary_card.html:14
#: bookwyrm/templates/snippets/announcement.html:34
msgid "Dismiss message"
msgstr "Dispensar mensagem"
@ -1011,7 +1136,7 @@ msgstr "<a href=\"%(user_path)s\">%(username)s</a> citou <a href=\"%(book_path)s
#: bookwyrm/templates/discover/discover.html:4
#: bookwyrm/templates/discover/discover.html:10
#: bookwyrm/templates/layout.html:78
#: bookwyrm/templates/layout.html:80
msgid "Discover"
msgstr "Explorar"
@ -1128,18 +1253,18 @@ msgstr "Se você não solicitou a redefinição de senha, ignore este e-mail."
msgid "Reset your %(site_name)s password"
msgstr "Redefinir sua senha no %(site_name)s"
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:39
#, python-format
msgid "%(site_name)s home page"
msgstr "Página inicial de %(site_name)s"
#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:232
#, python-format
msgid "About %(site_name)s"
msgstr "Sobre %(site_name)s"
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:234
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:236
msgid "Contact site admin"
msgstr "Falar com a administração"
@ -1153,7 +1278,7 @@ msgid "Direct Messages with <a href=\"%(path)s\">%(username)s</a>"
msgstr "Mensagens diretas com <a href=\"%(path)s\">%(username)s</a>"
#: bookwyrm/templates/feed/direct_messages.html:10
#: bookwyrm/templates/layout.html:111
#: bookwyrm/templates/layout.html:113
msgid "Direct Messages"
msgstr "Mensagens diretas"
@ -1182,11 +1307,11 @@ msgstr "Salvar configurações"
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr "carregar <span data-poll=\"stream/%(tab_key)s\">0</span> publicações não lida(s)"
#: bookwyrm/templates/feed/feed.html:80
#: bookwyrm/templates/feed/feed.html:86
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "Não há nenhuma atividade! Tente seguir um usuário para começar"
#: bookwyrm/templates/feed/feed.html:81
#: bookwyrm/templates/feed/feed.html:87
msgid "Alternatively, you can try enabling more status types"
msgstr "Uma outra opção é habilitar mais tipos de publicação"
@ -1206,7 +1331,7 @@ msgstr "Você pode definir ou alterar sua meta de leitura a qualquer momento em
msgid "Updates"
msgstr "Atualizações"
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:108
msgid "Your Books"
msgstr "Seus livros"
@ -1260,6 +1385,15 @@ msgstr "Não mostrar usuários sugeridos"
msgid "View directory"
msgstr "Ver diretório"
#: bookwyrm/templates/feed/summary_card.html:21
msgid "The end of the year is the best moment to take stock of all the books read during the last 12 months. How many pages have you read? Which book is your best-rated of the year? We compiled these stats, and more!"
msgstr "O fim do ano é o melhor momento para pensar nos livros que lemos nos últimos 12 meses. Quantas páginas você leu? Qual foi o seu livro mais bem avaliado? Compilamos esses e outros dados!"
#: bookwyrm/templates/feed/summary_card.html:26
#, python-format
msgid "Discover your stats for %(year)s!"
msgstr "Descubra suas estatísticas de %(year)s!"
#: bookwyrm/templates/get_started/book_preview.html:6
#, python-format
msgid "Have you read %(book_title)s?"
@ -1274,7 +1408,7 @@ msgid "What are you reading?"
msgstr "O que você está lendo?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:138
msgid "Search for a book"
msgstr "Pesquisar livro"
@ -1293,8 +1427,8 @@ msgstr "Você pode adicionar livros quando começar a usar o %(site_name)s."
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/group.html:19
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51
#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1505,28 +1639,28 @@ msgstr "Importar livros"
msgid "Data source:"
msgstr "Fonte dos dados:"
#: bookwyrm/templates/import/import.html:37
#: bookwyrm/templates/import/import.html:40
msgid "Data file:"
msgstr "Arquivo de dados:"
#: bookwyrm/templates/import/import.html:45
#: bookwyrm/templates/import/import.html:48
msgid "Include reviews"
msgstr "Incluir resenhas"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:53
msgid "Privacy setting for imported reviews:"
msgstr "Configurações de privacidade para resenhas importadas:"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/settings/federation/instance_blocklist.html:64
msgid "Import"
msgstr "Importar"
#: bookwyrm/templates/import/import.html:61
#: bookwyrm/templates/import/import.html:64
msgid "Recent Imports"
msgstr "Importações recentes"
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/import/import.html:66
msgid "No recent imports"
msgstr "Nenhuma importação recente"
@ -1594,27 +1728,31 @@ msgstr "Título"
msgid "ISBN"
msgstr "ISBN"
#: bookwyrm/templates/import/import_status.html:109
#: bookwyrm/templates/import/import_status.html:110
msgid "Openlibrary key"
msgstr "Chave Openlibrary"
#: bookwyrm/templates/import/import_status.html:114
#: bookwyrm/templates/shelf/shelf.html:145
#: bookwyrm/templates/shelf/shelf.html:169
msgid "Author"
msgstr "Autor/a"
#: bookwyrm/templates/import/import_status.html:112
#: bookwyrm/templates/import/import_status.html:117
msgid "Shelf"
msgstr "Estante"
#: bookwyrm/templates/import/import_status.html:115
#: bookwyrm/templates/import/import_status.html:120
#: bookwyrm/templates/import/manual_review.html:13
#: bookwyrm/templates/snippets/create_status.html:17
msgid "Review"
msgstr "Resenhar"
#: bookwyrm/templates/import/import_status.html:119
#: bookwyrm/templates/import/import_status.html:124
msgid "Book"
msgstr "Livro"
#: bookwyrm/templates/import/import_status.html:122
#: bookwyrm/templates/import/import_status.html:127
#: bookwyrm/templates/settings/announcements/announcements.html:38
#: bookwyrm/templates/settings/federation/instance_list.html:46
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44
@ -1624,31 +1762,31 @@ msgstr "Livro"
msgid "Status"
msgstr "Publicação"
#: bookwyrm/templates/import/import_status.html:130
#: bookwyrm/templates/import/import_status.html:135
msgid "Import preview unavailable."
msgstr "Pré-visualização de importação indisponível."
#: bookwyrm/templates/import/import_status.html:162
#: bookwyrm/templates/import/import_status.html:172
msgid "View imported review"
msgstr "Visualizar resenha importada"
#: bookwyrm/templates/import/import_status.html:176
#: bookwyrm/templates/import/import_status.html:186
msgid "Imported"
msgstr "Importado"
#: bookwyrm/templates/import/import_status.html:182
#: bookwyrm/templates/import/import_status.html:192
msgid "Needs manual review"
msgstr "Precisa de resenha manual"
#: bookwyrm/templates/import/import_status.html:195
#: bookwyrm/templates/import/import_status.html:205
msgid "Retry"
msgstr "Tentar novamente"
#: bookwyrm/templates/import/import_status.html:213
#: bookwyrm/templates/import/import_status.html:223
msgid "This import is in an old format that is no longer supported. If you would like to troubleshoot missing items from this import, click the button below to update the import format."
msgstr "Esta importação está em um formato antigo que não é mais compatível. Se quiser resolver alguns itens faltantes dessa importação, clique no botão abaixo para atualizar o formato da importação."
#: bookwyrm/templates/import/import_status.html:215
#: bookwyrm/templates/import/import_status.html:225
msgid "Update import"
msgstr "Atualizar importação"
@ -1769,7 +1907,7 @@ msgid "Login"
msgstr "Entrar"
#: bookwyrm/templates/landing/login.html:7
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:179
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:181
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr "Entrar"
@ -1778,7 +1916,7 @@ msgstr "Entrar"
msgid "Success! Email address confirmed."
msgstr "Endereço de e-mail confirmado com sucesso."
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:172
#: bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
@ -1786,12 +1924,12 @@ msgstr "Usuário:"
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
#: bookwyrm/templates/layout.html:174 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/layout.html:176 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/snippets/register_form.html:20
msgid "Password:"
msgstr "Senha:"
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:176
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:178
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr "Esqueceu sua senha?"
@ -1819,23 +1957,23 @@ msgstr "Redefinir senha"
msgid "%(site_name)s search"
msgstr "Busca %(site_name)s"
#: bookwyrm/templates/layout.html:43
#: bookwyrm/templates/layout.html:45
msgid "Search for a book, user, or list"
msgstr "Pesquisar livro, usuário ou lista"
#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62
#: bookwyrm/templates/layout.html:63 bookwyrm/templates/layout.html:64
msgid "Main navigation menu"
msgstr "Menu de navegação principal"
#: bookwyrm/templates/layout.html:72
#: bookwyrm/templates/layout.html:74
msgid "Feed"
msgstr "Novidades"
#: bookwyrm/templates/layout.html:116
#: bookwyrm/templates/layout.html:118
msgid "Settings"
msgstr "Configurações"
#: bookwyrm/templates/layout.html:125
#: bookwyrm/templates/layout.html:127
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
@ -1843,46 +1981,46 @@ msgstr "Configurações"
msgid "Invites"
msgstr "Convites"
#: bookwyrm/templates/layout.html:132
#: bookwyrm/templates/layout.html:134
msgid "Admin"
msgstr "Admin"
#: bookwyrm/templates/layout.html:139
#: bookwyrm/templates/layout.html:141
msgid "Log out"
msgstr "Sair"
#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148
#: bookwyrm/templates/layout.html:149 bookwyrm/templates/layout.html:150
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "Notificações"
#: bookwyrm/templates/layout.html:175 bookwyrm/templates/ostatus/error.html:33
#: bookwyrm/templates/layout.html:177 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr "senha"
#: bookwyrm/templates/layout.html:187
#: bookwyrm/templates/layout.html:189
msgid "Join"
msgstr "Registrar"
#: bookwyrm/templates/layout.html:221
#: bookwyrm/templates/layout.html:223
msgid "Successfully posted status"
msgstr "Publicação feita com sucesso"
#: bookwyrm/templates/layout.html:222
#: bookwyrm/templates/layout.html:224
msgid "Error posting status"
msgstr "Erro ao publicar"
#: bookwyrm/templates/layout.html:238
#: bookwyrm/templates/layout.html:240
msgid "Documentation"
msgstr "Documentação"
#: bookwyrm/templates/layout.html:245
#: bookwyrm/templates/layout.html:247
#, python-format
msgid "Support %(site_name)s on <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a>"
msgstr "Apoie a instância %(site_name)s: <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a>"
#: bookwyrm/templates/layout.html:249
#: bookwyrm/templates/layout.html:251
msgid "BookWyrm's source code is freely available. You can contribute or report issues on <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a>."
msgstr "O código-fonte da BookWyrm está disponível gratuitamente. Você pode contribuir ou reportar problemas no <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a>."
@ -2075,15 +2213,11 @@ msgstr "Sugerir"
msgid "Embed this list on a website"
msgstr "Incorpore esta lista em um site"
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
msgid "Copy embed code"
msgstr "Copiar código de incorporação"
#: bookwyrm/templates/lists/list.html:193
msgid "Copied!"
msgstr "Copiado!"
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
#, 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"
@ -3496,12 +3630,12 @@ msgstr "Andamento:"
#: bookwyrm/templates/snippets/create_status/comment.html:53
#: bookwyrm/templates/snippets/progress_field.html:18
msgid "pages"
msgstr "páginas"
msgstr "página"
#: bookwyrm/templates/snippets/create_status/comment.html:59
#: bookwyrm/templates/snippets/progress_field.html:23
msgid "percent"
msgstr "porcento"
msgstr "porcentagem"
#: bookwyrm/templates/snippets/create_status/comment.html:66
#, python-format
@ -4145,7 +4279,7 @@ msgstr "Arquivo excede o tamanho máximo: 10MB"
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/imports/import_data.py:64
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "Não é um arquivo csv válido"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-08 15:40+0000\n"
"PO-Revision-Date: 2021-12-09 18:56\n"
"POT-Creation-Date: 2021-12-28 20:12+0000\n"
"PO-Revision-Date: 2021-12-28 21:17\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Chinese Simplified\n"
"Language: zh\n"
@ -72,16 +72,16 @@ msgstr "升序"
msgid "Descending"
msgstr "降序"
#: bookwyrm/importers/importer.py:141 bookwyrm/importers/importer.py:163
#: bookwyrm/importers/importer.py:145 bookwyrm/importers/importer.py:167
msgid "Error loading book"
msgstr "加载书籍时出错"
#: bookwyrm/importers/importer.py:150
#: bookwyrm/importers/importer.py:154
msgid "Could not find a match for book"
msgstr "找不到匹配的书"
#: bookwyrm/models/base_model.py:17
#: bookwyrm/templates/import/import_status.html:190
#: bookwyrm/templates/import/import_status.html:200
msgid "Pending"
msgstr "待处理"
@ -144,7 +144,7 @@ msgstr "%(value)s 不是有效的 remote_id"
msgid "%(value)s is not a valid username"
msgstr "%(value)s 不是有效的用户名"
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:173
#: bookwyrm/templates/ostatus/error.html:29
msgid "username"
msgstr "用户名"
@ -159,15 +159,15 @@ msgstr "书评"
#: bookwyrm/models/user.py:33
msgid "Comments"
msgstr ""
msgstr "评论"
#: bookwyrm/models/user.py:34
msgid "Quotations"
msgstr ""
msgstr "引用"
#: bookwyrm/models/user.py:35
msgid "Everything else"
msgstr ""
msgstr "所有其它内容"
#: bookwyrm/settings.py:118
msgid "Home Timeline"
@ -243,6 +243,133 @@ msgstr "服务器错误"
msgid "Something went wrong! Sorry about that."
msgstr "某些东西出错了!对不起啦。"
#: bookwyrm/templates/annual_summary/layout.html:7
#: bookwyrm/templates/feed/summary_card.html:8
#, python-format
msgid "%(year)s in the books"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:43
#, python-format
msgid "%(year)s <em>in the books</em>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:47
#, python-format
msgid "<em>%(display_name)ss</em> year of reading"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:53
msgid "Share this page"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: <strong>public with key</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:78
msgid "The page can be seen by anyone with the complete address."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: <strong>private</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:99
msgid "When you make your page private, the old key wont give access to the page anymore. A new key will be created if the page is once again made public."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didnt finish any book in %(year)s"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
msgid "In %(year)s, %(display_name)s read %(books_total)s book<br />for a total of %(pages_total)s pages!"
msgid_plural "In %(year)s, %(display_name)s read %(books_total)s books<br />for a total of %(pages_total)s pages!"
msgstr[0] ""
#: bookwyrm/templates/annual_summary/layout.html:124
msgid "Thats great!"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesnt have pages)"
msgid_plural "(%(no_page_number)s books dont have pages)"
msgstr[0] ""
#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:155
#: bookwyrm/templates/annual_summary/layout.html:176
#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "作者"
#: bookwyrm/templates/annual_summary/layout.html:161
#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "<strong>%(pages)s</strong> pages"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
msgid "%(display_name)s left %(ratings_total)s rating, <br />their average rating is %(rating_average)s"
msgid_plural "%(display_name)s left %(ratings_total)s ratings, <br />their average rating is %(rating_average)s"
msgstr[0] ""
#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: <strong>%(rating)s</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
msgid "All the books %(display_name)s read in %(year)s"
msgstr ""
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
@ -431,13 +558,6 @@ msgstr ""
msgid "Confirm"
msgstr "确认"
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "作者"
#: bookwyrm/templates/book/book.html:55 bookwyrm/templates/book/book.html:56
msgid "Edit Book"
msgstr "编辑书目"
@ -517,7 +637,7 @@ msgstr "主题"
msgid "Places"
msgstr "地点"
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:75
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:77
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -892,7 +1012,7 @@ msgstr "跨站社区"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
#: bookwyrm/templates/layout.html:101
#: bookwyrm/templates/layout.html:103
msgid "Directory"
msgstr "目录"
@ -912,6 +1032,8 @@ msgstr "你可以在任何时候从你的 <a href=\"%(path)s\">个人资料设
#: bookwyrm/templates/directory/directory.html:29
#: bookwyrm/templates/directory/directory.html:31
#: bookwyrm/templates/feed/goal_card.html:17
#: bookwyrm/templates/feed/summary_card.html:12
#: bookwyrm/templates/feed/summary_card.html:14
#: bookwyrm/templates/snippets/announcement.html:34
msgid "Dismiss message"
msgstr "遣散消息"
@ -1008,7 +1130,7 @@ msgstr "<a href=\"%(user_path)s\">%(username)s</a> 引用了 <a href=\"%(book_pa
#: bookwyrm/templates/discover/discover.html:4
#: bookwyrm/templates/discover/discover.html:10
#: bookwyrm/templates/layout.html:78
#: bookwyrm/templates/layout.html:80
msgid "Discover"
msgstr "发现"
@ -1125,18 +1247,18 @@ msgstr "如果你没有请求重设密码,你可以忽略这封邮件。"
msgid "Reset your %(site_name)s password"
msgstr "重置你在 %(site_name)s 的密码"
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:39
#, python-format
msgid "%(site_name)s home page"
msgstr ""
#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:232
#, python-format
msgid "About %(site_name)s"
msgstr "关于 %(site_name)s"
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:234
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:236
msgid "Contact site admin"
msgstr "联系站点管理员"
@ -1150,7 +1272,7 @@ msgid "Direct Messages with <a href=\"%(path)s\">%(username)s</a>"
msgstr "与 <a href=\"%(path)s\">%(username)s</a> 私信"
#: bookwyrm/templates/feed/direct_messages.html:10
#: bookwyrm/templates/layout.html:111
#: bookwyrm/templates/layout.html:113
msgid "Direct Messages"
msgstr "私信"
@ -1179,11 +1301,11 @@ msgstr ""
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr "加载 <span data-poll=\"stream/%(tab_key)s\">0</span> 条未读状态"
#: bookwyrm/templates/feed/feed.html:80
#: bookwyrm/templates/feed/feed.html:86
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "现在还没有任何活动!尝试从关注一个用户开始吧"
#: bookwyrm/templates/feed/feed.html:81
#: bookwyrm/templates/feed/feed.html:87
msgid "Alternatively, you can try enabling more status types"
msgstr ""
@ -1203,7 +1325,7 @@ msgstr "你可以在任何时候从你的<a href=\"%(path)s\">个人资料页面
msgid "Updates"
msgstr "更新"
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:108
msgid "Your Books"
msgstr "你的书目"
@ -1257,6 +1379,15 @@ msgstr "不显示推荐用户"
msgid "View directory"
msgstr "查看目录"
#: bookwyrm/templates/feed/summary_card.html:21
msgid "The end of the year is the best moment to take stock of all the books read during the last 12 months. How many pages have you read? Which book is your best-rated of the year? We compiled these stats, and more!"
msgstr ""
#: bookwyrm/templates/feed/summary_card.html:26
#, python-format
msgid "Discover your stats for %(year)s!"
msgstr ""
#: bookwyrm/templates/get_started/book_preview.html:6
#, python-format
msgid "Have you read %(book_title)s?"
@ -1271,7 +1402,7 @@ msgid "What are you reading?"
msgstr "你在阅读什么?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:138
msgid "Search for a book"
msgstr "搜索书目"
@ -1290,8 +1421,8 @@ msgstr "你可以在开始使用 %(site_name)s 后添加书目。"
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/group.html:19
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51
#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1500,28 +1631,28 @@ msgstr "导入书目"
msgid "Data source:"
msgstr "数据来源:"
#: bookwyrm/templates/import/import.html:37
#: bookwyrm/templates/import/import.html:40
msgid "Data file:"
msgstr "数据文件:"
#: bookwyrm/templates/import/import.html:45
#: bookwyrm/templates/import/import.html:48
msgid "Include reviews"
msgstr "纳入书评"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:53
msgid "Privacy setting for imported reviews:"
msgstr "导入书评的隐私设定"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/settings/federation/instance_blocklist.html:64
msgid "Import"
msgstr "导入"
#: bookwyrm/templates/import/import.html:61
#: bookwyrm/templates/import/import.html:64
msgid "Recent Imports"
msgstr "最近的导入"
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/import/import.html:66
msgid "No recent imports"
msgstr "无最近的导入"
@ -1587,27 +1718,31 @@ msgstr "标题"
msgid "ISBN"
msgstr "ISBN"
#: bookwyrm/templates/import/import_status.html:109
#: bookwyrm/templates/import/import_status.html:110
msgid "Openlibrary key"
msgstr ""
#: bookwyrm/templates/import/import_status.html:114
#: bookwyrm/templates/shelf/shelf.html:145
#: bookwyrm/templates/shelf/shelf.html:169
msgid "Author"
msgstr "作者"
#: bookwyrm/templates/import/import_status.html:112
#: bookwyrm/templates/import/import_status.html:117
msgid "Shelf"
msgstr "书架"
#: bookwyrm/templates/import/import_status.html:115
#: bookwyrm/templates/import/import_status.html:120
#: bookwyrm/templates/import/manual_review.html:13
#: bookwyrm/templates/snippets/create_status.html:17
msgid "Review"
msgstr "书评"
#: bookwyrm/templates/import/import_status.html:119
#: bookwyrm/templates/import/import_status.html:124
msgid "Book"
msgstr "书目"
#: bookwyrm/templates/import/import_status.html:122
#: bookwyrm/templates/import/import_status.html:127
#: bookwyrm/templates/settings/announcements/announcements.html:38
#: bookwyrm/templates/settings/federation/instance_list.html:46
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44
@ -1617,31 +1752,31 @@ msgstr "书目"
msgid "Status"
msgstr "状态"
#: bookwyrm/templates/import/import_status.html:130
#: bookwyrm/templates/import/import_status.html:135
msgid "Import preview unavailable."
msgstr "导入预览不可用。"
#: bookwyrm/templates/import/import_status.html:162
#: bookwyrm/templates/import/import_status.html:172
msgid "View imported review"
msgstr "查看已导入的书评"
#: bookwyrm/templates/import/import_status.html:176
#: bookwyrm/templates/import/import_status.html:186
msgid "Imported"
msgstr "已导入"
#: bookwyrm/templates/import/import_status.html:182
#: bookwyrm/templates/import/import_status.html:192
msgid "Needs manual review"
msgstr "需要手动批准"
#: bookwyrm/templates/import/import_status.html:195
#: bookwyrm/templates/import/import_status.html:205
msgid "Retry"
msgstr "重试"
#: bookwyrm/templates/import/import_status.html:213
#: bookwyrm/templates/import/import_status.html:223
msgid "This import is in an old format that is no longer supported. If you would like to troubleshoot missing items from this import, click the button below to update the import format."
msgstr "此导入所用格式已不再受支持。 如果您想要在此次导入中排查缺失的项目,请点击下面的按钮来更新导入格式。"
#: bookwyrm/templates/import/import_status.html:215
#: bookwyrm/templates/import/import_status.html:225
msgid "Update import"
msgstr "更新导入"
@ -1762,7 +1897,7 @@ msgid "Login"
msgstr "登录"
#: bookwyrm/templates/landing/login.html:7
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:179
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:181
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr "登录"
@ -1771,7 +1906,7 @@ msgstr "登录"
msgid "Success! Email address confirmed."
msgstr "成功!邮箱地址已确认。"
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:172
#: bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
@ -1779,12 +1914,12 @@ msgstr "用户名:"
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
#: bookwyrm/templates/layout.html:174 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/layout.html:176 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/snippets/register_form.html:20
msgid "Password:"
msgstr "密码:"
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:176
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:178
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr "忘记了密码?"
@ -1812,23 +1947,23 @@ msgstr "重设密码"
msgid "%(site_name)s search"
msgstr "%(site_name)s 搜索"
#: bookwyrm/templates/layout.html:43
#: bookwyrm/templates/layout.html:45
msgid "Search for a book, user, or list"
msgstr "搜索书籍、用户或列表"
#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62
#: bookwyrm/templates/layout.html:63 bookwyrm/templates/layout.html:64
msgid "Main navigation menu"
msgstr "主导航菜单"
#: bookwyrm/templates/layout.html:72
#: bookwyrm/templates/layout.html:74
msgid "Feed"
msgstr "动态"
#: bookwyrm/templates/layout.html:116
#: bookwyrm/templates/layout.html:118
msgid "Settings"
msgstr "设置"
#: bookwyrm/templates/layout.html:125
#: bookwyrm/templates/layout.html:127
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
@ -1836,46 +1971,46 @@ msgstr "设置"
msgid "Invites"
msgstr "邀请"
#: bookwyrm/templates/layout.html:132
#: bookwyrm/templates/layout.html:134
msgid "Admin"
msgstr "管理员"
#: bookwyrm/templates/layout.html:139
#: bookwyrm/templates/layout.html:141
msgid "Log out"
msgstr "登出"
#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148
#: bookwyrm/templates/layout.html:149 bookwyrm/templates/layout.html:150
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "通知"
#: bookwyrm/templates/layout.html:175 bookwyrm/templates/ostatus/error.html:33
#: bookwyrm/templates/layout.html:177 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr "密码"
#: bookwyrm/templates/layout.html:187
#: bookwyrm/templates/layout.html:189
msgid "Join"
msgstr "加入"
#: bookwyrm/templates/layout.html:221
#: bookwyrm/templates/layout.html:223
msgid "Successfully posted status"
msgstr "成功发布的状态"
#: bookwyrm/templates/layout.html:222
#: bookwyrm/templates/layout.html:224
msgid "Error posting status"
msgstr "发布状态时出错"
#: bookwyrm/templates/layout.html:238
#: bookwyrm/templates/layout.html:240
msgid "Documentation"
msgstr "文档"
#: bookwyrm/templates/layout.html:245
#: bookwyrm/templates/layout.html:247
#, python-format
msgid "Support %(site_name)s on <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a>"
msgstr "在 <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a> 上支持 %(site_name)s"
#: bookwyrm/templates/layout.html:249
#: bookwyrm/templates/layout.html:251
msgid "BookWyrm's source code is freely available. You can contribute or report issues on <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a>."
msgstr "BookWyrm 是开源软件。你可以在 <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a> 贡献或报告问题。"
@ -2068,15 +2203,11 @@ msgstr "推荐"
msgid "Embed this list on a website"
msgstr ""
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
msgid "Copy embed code"
msgstr ""
#: bookwyrm/templates/lists/list.html:193
msgid "Copied!"
msgstr ""
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr ""
@ -4126,7 +4257,7 @@ msgstr "文件超过了最大大小: 10MB"
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s%(subtitle)s"
#: bookwyrm/views/imports/import_data.py:64
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "不是有效的 csv 文件"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-08 15:40+0000\n"
"PO-Revision-Date: 2021-12-09 18:56\n"
"POT-Creation-Date: 2021-12-28 20:12+0000\n"
"PO-Revision-Date: 2021-12-28 21:17\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Chinese Traditional\n"
"Language: zh\n"
@ -72,16 +72,16 @@ msgstr "升序"
msgid "Descending"
msgstr "降序"
#: bookwyrm/importers/importer.py:141 bookwyrm/importers/importer.py:163
#: bookwyrm/importers/importer.py:145 bookwyrm/importers/importer.py:167
msgid "Error loading book"
msgstr ""
#: bookwyrm/importers/importer.py:150
#: bookwyrm/importers/importer.py:154
msgid "Could not find a match for book"
msgstr ""
#: bookwyrm/models/base_model.py:17
#: bookwyrm/templates/import/import_status.html:190
#: bookwyrm/templates/import/import_status.html:200
msgid "Pending"
msgstr ""
@ -144,7 +144,7 @@ msgstr "%(value)s 不是有效的 remote_id"
msgid "%(value)s is not a valid username"
msgstr "%(value)s 不是有效的使用者名稱"
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:171
#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:173
#: bookwyrm/templates/ostatus/error.html:29
msgid "username"
msgstr "使用者名稱"
@ -243,6 +243,133 @@ msgstr "伺服器錯誤"
msgid "Something went wrong! Sorry about that."
msgstr "某些東西出錯了!抱歉。"
#: bookwyrm/templates/annual_summary/layout.html:7
#: bookwyrm/templates/feed/summary_card.html:8
#, python-format
msgid "%(year)s in the books"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:43
#, python-format
msgid "%(year)s <em>in the books</em>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:47
#, python-format
msgid "<em>%(display_name)ss</em> year of reading"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:53
msgid "Share this page"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: <strong>public with key</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:78
msgid "The page can be seen by anyone with the complete address."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: <strong>private</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:99
msgid "When you make your page private, the old key wont give access to the page anymore. A new key will be created if the page is once again made public."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didnt finish any book in %(year)s"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
msgid "In %(year)s, %(display_name)s read %(books_total)s book<br />for a total of %(pages_total)s pages!"
msgid_plural "In %(year)s, %(display_name)s read %(books_total)s books<br />for a total of %(pages_total)s pages!"
msgstr[0] ""
#: bookwyrm/templates/annual_summary/layout.html:124
msgid "Thats great!"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesnt have pages)"
msgid_plural "(%(no_page_number)s books dont have pages)"
msgstr[0] ""
#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:155
#: bookwyrm/templates/annual_summary/layout.html:176
#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "作者"
#: bookwyrm/templates/annual_summary/layout.html:161
#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "<strong>%(pages)s</strong> pages"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
msgid "%(display_name)s left %(ratings_total)s rating, <br />their average rating is %(rating_average)s"
msgid_plural "%(display_name)s left %(ratings_total)s ratings, <br />their average rating is %(rating_average)s"
msgstr[0] ""
#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: <strong>%(rating)s</strong>"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
msgid "All the books %(display_name)s read in %(year)s"
msgstr ""
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
msgid "Edit Author"
@ -431,13 +558,6 @@ msgstr ""
msgid "Confirm"
msgstr "確認"
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
#: bookwyrm/templates/landing/small-book.html:18
msgid "by"
msgstr "作者"
#: bookwyrm/templates/book/book.html:55 bookwyrm/templates/book/book.html:56
msgid "Edit Book"
msgstr "編輯書目"
@ -517,7 +637,7 @@ msgstr "主題"
msgid "Places"
msgstr "地點"
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:75
#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:77
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@ -892,7 +1012,7 @@ msgstr "跨站社群"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
#: bookwyrm/templates/layout.html:101
#: bookwyrm/templates/layout.html:103
msgid "Directory"
msgstr "目錄"
@ -912,6 +1032,8 @@ msgstr "你可以在任何時候從你的 <a href=\"%(path)s\">使用者資料
#: bookwyrm/templates/directory/directory.html:29
#: bookwyrm/templates/directory/directory.html:31
#: bookwyrm/templates/feed/goal_card.html:17
#: bookwyrm/templates/feed/summary_card.html:12
#: bookwyrm/templates/feed/summary_card.html:14
#: bookwyrm/templates/snippets/announcement.html:34
msgid "Dismiss message"
msgstr "關閉訊息"
@ -1008,7 +1130,7 @@ msgstr ""
#: bookwyrm/templates/discover/discover.html:4
#: bookwyrm/templates/discover/discover.html:10
#: bookwyrm/templates/layout.html:78
#: bookwyrm/templates/layout.html:80
msgid "Discover"
msgstr ""
@ -1125,18 +1247,18 @@ msgstr "如果你沒有請求重設密碼,你可以忽略這封郵件。"
msgid "Reset your %(site_name)s password"
msgstr "重置你在 %(site_name)s 的密碼"
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:37
#: bookwyrm/templates/embed-layout.html:21 bookwyrm/templates/layout.html:39
#, python-format
msgid "%(site_name)s home page"
msgstr ""
#: bookwyrm/templates/embed-layout.html:34
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:230
#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:232
#, python-format
msgid "About %(site_name)s"
msgstr "關於 %(site_name)s"
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:234
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:236
msgid "Contact site admin"
msgstr "聯絡網站管理員"
@ -1150,7 +1272,7 @@ msgid "Direct Messages with <a href=\"%(path)s\">%(username)s</a>"
msgstr "與 <a href=\"%(path)s\">%(username)s</a> 私信"
#: bookwyrm/templates/feed/direct_messages.html:10
#: bookwyrm/templates/layout.html:111
#: bookwyrm/templates/layout.html:113
msgid "Direct Messages"
msgstr "私信"
@ -1179,11 +1301,11 @@ msgstr ""
msgid "load <span data-poll=\"stream/%(tab_key)s\">0</span> unread status(es)"
msgstr ""
#: bookwyrm/templates/feed/feed.html:80
#: bookwyrm/templates/feed/feed.html:86
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "現在還沒有任何活動!嘗試著從關注一個使用者開始吧"
#: bookwyrm/templates/feed/feed.html:81
#: bookwyrm/templates/feed/feed.html:87
msgid "Alternatively, you can try enabling more status types"
msgstr ""
@ -1203,7 +1325,7 @@ msgstr "你可以在任何時候從你的<a href=\"%(path)s\">使用者資料頁
msgid "Updates"
msgstr "更新"
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:106
#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:108
msgid "Your Books"
msgstr "你的書目"
@ -1257,6 +1379,15 @@ msgstr ""
msgid "View directory"
msgstr ""
#: bookwyrm/templates/feed/summary_card.html:21
msgid "The end of the year is the best moment to take stock of all the books read during the last 12 months. How many pages have you read? Which book is your best-rated of the year? We compiled these stats, and more!"
msgstr ""
#: bookwyrm/templates/feed/summary_card.html:26
#, python-format
msgid "Discover your stats for %(year)s!"
msgstr ""
#: bookwyrm/templates/get_started/book_preview.html:6
#, python-format
msgid "Have you read %(book_title)s?"
@ -1271,7 +1402,7 @@ msgid "What are you reading?"
msgstr "你在閱讀什麼?"
#: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:138
#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:138
msgid "Search for a book"
msgstr "搜尋書目"
@ -1290,8 +1421,8 @@ msgstr "你可以在開始使用 %(site_name)s 後新增書目。"
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/group.html:19
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:51
#: bookwyrm/templates/layout.html:52 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:53
#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:142
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@ -1500,28 +1631,28 @@ msgstr "匯入書目"
msgid "Data source:"
msgstr "資料來源:"
#: bookwyrm/templates/import/import.html:37
#: bookwyrm/templates/import/import.html:40
msgid "Data file:"
msgstr "資料檔案:"
#: bookwyrm/templates/import/import.html:45
#: bookwyrm/templates/import/import.html:48
msgid "Include reviews"
msgstr "納入書評"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:53
msgid "Privacy setting for imported reviews:"
msgstr "匯入書評的隱私設定"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/settings/federation/instance_blocklist.html:64
msgid "Import"
msgstr "匯入"
#: bookwyrm/templates/import/import.html:61
#: bookwyrm/templates/import/import.html:64
msgid "Recent Imports"
msgstr "最近的匯入"
#: bookwyrm/templates/import/import.html:63
#: bookwyrm/templates/import/import.html:66
msgid "No recent imports"
msgstr "無最近的匯入"
@ -1587,27 +1718,31 @@ msgstr "標題"
msgid "ISBN"
msgstr ""
#: bookwyrm/templates/import/import_status.html:109
#: bookwyrm/templates/import/import_status.html:110
msgid "Openlibrary key"
msgstr ""
#: bookwyrm/templates/import/import_status.html:114
#: bookwyrm/templates/shelf/shelf.html:145
#: bookwyrm/templates/shelf/shelf.html:169
msgid "Author"
msgstr "作者"
#: bookwyrm/templates/import/import_status.html:112
#: bookwyrm/templates/import/import_status.html:117
msgid "Shelf"
msgstr ""
#: bookwyrm/templates/import/import_status.html:115
#: bookwyrm/templates/import/import_status.html:120
#: bookwyrm/templates/import/manual_review.html:13
#: bookwyrm/templates/snippets/create_status.html:17
msgid "Review"
msgstr "書評"
#: bookwyrm/templates/import/import_status.html:119
#: bookwyrm/templates/import/import_status.html:124
msgid "Book"
msgstr "書目"
#: bookwyrm/templates/import/import_status.html:122
#: bookwyrm/templates/import/import_status.html:127
#: bookwyrm/templates/settings/announcements/announcements.html:38
#: bookwyrm/templates/settings/federation/instance_list.html:46
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44
@ -1617,31 +1752,31 @@ msgstr "書目"
msgid "Status"
msgstr "狀態"
#: bookwyrm/templates/import/import_status.html:130
#: bookwyrm/templates/import/import_status.html:135
msgid "Import preview unavailable."
msgstr ""
#: bookwyrm/templates/import/import_status.html:162
#: bookwyrm/templates/import/import_status.html:172
msgid "View imported review"
msgstr ""
#: bookwyrm/templates/import/import_status.html:176
#: bookwyrm/templates/import/import_status.html:186
msgid "Imported"
msgstr "已匯入"
#: bookwyrm/templates/import/import_status.html:182
#: bookwyrm/templates/import/import_status.html:192
msgid "Needs manual review"
msgstr ""
#: bookwyrm/templates/import/import_status.html:195
#: bookwyrm/templates/import/import_status.html:205
msgid "Retry"
msgstr ""
#: bookwyrm/templates/import/import_status.html:213
#: bookwyrm/templates/import/import_status.html:223
msgid "This import is in an old format that is no longer supported. If you would like to troubleshoot missing items from this import, click the button below to update the import format."
msgstr ""
#: bookwyrm/templates/import/import_status.html:215
#: bookwyrm/templates/import/import_status.html:225
msgid "Update import"
msgstr ""
@ -1762,7 +1897,7 @@ msgid "Login"
msgstr "登入"
#: bookwyrm/templates/landing/login.html:7
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:179
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:181
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr "登入"
@ -1771,7 +1906,7 @@ msgstr "登入"
msgid "Success! Email address confirmed."
msgstr ""
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170
#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:172
#: bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
@ -1779,12 +1914,12 @@ msgstr "使用者名稱:"
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
#: bookwyrm/templates/layout.html:174 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/layout.html:176 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/snippets/register_form.html:20
msgid "Password:"
msgstr "密碼:"
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:176
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:178
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr "忘記了密碼?"
@ -1812,23 +1947,23 @@ msgstr "重設密碼"
msgid "%(site_name)s search"
msgstr ""
#: bookwyrm/templates/layout.html:43
#: bookwyrm/templates/layout.html:45
msgid "Search for a book, user, or list"
msgstr ""
#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62
#: bookwyrm/templates/layout.html:63 bookwyrm/templates/layout.html:64
msgid "Main navigation menu"
msgstr "主導航選單"
#: bookwyrm/templates/layout.html:72
#: bookwyrm/templates/layout.html:74
msgid "Feed"
msgstr "動態"
#: bookwyrm/templates/layout.html:116
#: bookwyrm/templates/layout.html:118
msgid "Settings"
msgstr "設定"
#: bookwyrm/templates/layout.html:125
#: bookwyrm/templates/layout.html:127
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
@ -1836,46 +1971,46 @@ msgstr "設定"
msgid "Invites"
msgstr "邀請"
#: bookwyrm/templates/layout.html:132
#: bookwyrm/templates/layout.html:134
msgid "Admin"
msgstr "管理員"
#: bookwyrm/templates/layout.html:139
#: bookwyrm/templates/layout.html:141
msgid "Log out"
msgstr "登出"
#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148
#: bookwyrm/templates/layout.html:149 bookwyrm/templates/layout.html:150
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr "通知"
#: bookwyrm/templates/layout.html:175 bookwyrm/templates/ostatus/error.html:33
#: bookwyrm/templates/layout.html:177 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr "密碼"
#: bookwyrm/templates/layout.html:187
#: bookwyrm/templates/layout.html:189
msgid "Join"
msgstr "加入"
#: bookwyrm/templates/layout.html:221
#: bookwyrm/templates/layout.html:223
msgid "Successfully posted status"
msgstr ""
#: bookwyrm/templates/layout.html:222
#: bookwyrm/templates/layout.html:224
msgid "Error posting status"
msgstr ""
#: bookwyrm/templates/layout.html:238
#: bookwyrm/templates/layout.html:240
msgid "Documentation"
msgstr "文件:"
#: bookwyrm/templates/layout.html:245
#: bookwyrm/templates/layout.html:247
#, python-format
msgid "Support %(site_name)s on <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a>"
msgstr "在 <a href=\"%(support_link)s\" target=\"_blank\">%(support_title)s</a> 上支援 %(site_name)s"
#: bookwyrm/templates/layout.html:249
#: bookwyrm/templates/layout.html:251
msgid "BookWyrm's source code is freely available. You can contribute or report issues on <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a>."
msgstr "BookWyrm 是開源軟體。你可以在 <a href=\"https://github.com/mouse-reeve/bookwyrm\">GitHub</a> 貢獻或報告問題。"
@ -2068,15 +2203,11 @@ msgstr "推薦"
msgid "Embed this list on a website"
msgstr ""
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
msgid "Copy embed code"
msgstr ""
#: bookwyrm/templates/lists/list.html:193
msgid "Copied!"
msgstr ""
#: bookwyrm/templates/lists/list.html:193
#: bookwyrm/templates/lists/list.html:194
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr ""
@ -4126,7 +4257,7 @@ msgstr "檔案超過了最大大小: 10MB"
msgid "%(title)s: %(subtitle)s"
msgstr ""
#: bookwyrm/views/imports/import_data.py:64
#: bookwyrm/views/imports/import_data.py:67
msgid "Not a valid csv file"
msgstr "不是有效的 csv 檔案"

View file

@ -4,10 +4,11 @@
},
"devDependencies": {
"eslint": "^7.23.0",
"prettier": "2.5.1",
"stylelint": "^13.12.0",
"stylelint-config-standard": "^21.0.0",
"stylelint-order": "^4.1.0",
"watch": "^1.0.2"
"watch": "^0.13.0"
},
"dependencies": {
"merge": "2.1.1",

View file

@ -1,6 +1,6 @@
celery==4.4.2
colorthief==0.2.1
Django==3.2.5
Django==3.2.10
django-imagekit==4.1.0
django-model-utils==4.0.0
environs==9.3.4

3382
yarn.lock

File diff suppressed because it is too large Load diff