mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2024-12-27 02:20:31 +00:00
Merge branch 'main' into list-not-loading
This commit is contained in:
commit
975ef7d38e
96 changed files with 5890 additions and 3044 deletions
|
@ -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
|
||||
|
|
|
@ -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
24
.github/workflows/prettier.yaml
vendored
Normal 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
|
|
@ -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
|
||||
|
||||
|
|
18
bookwyrm/migrations/0121_user_summary_keys.py
Normal file
18
bookwyrm/migrations/0121_user_summary_keys.py
Normal 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),
|
||||
),
|
||||
]
|
|
@ -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
|
||||
|
|
|
@ -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],
|
||||
|
|
|
@ -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),
|
||||
},
|
||||
|
|
|
@ -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.
|
||||
******************************************************************************/
|
||||
|
|
95
bookwyrm/static/css/fonts/dm_serif_display/OFL.txt
Normal file
95
bookwyrm/static/css/fonts/dm_serif_display/OFL.txt
Normal 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.
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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"
|
||||
}
|
19
bookwyrm/static/css/vendor/dm_serif_display.css
vendored
Normal file
19
bookwyrm/static/css/vendor/dm_serif_display.css
vendored
Normal 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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}();
|
||||
|
||||
})();
|
||||
|
|
|
@ -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(".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(".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-hides]")
|
||||
.forEach((button) => button.addEventListener("change", this.hideForm.bind(this)));
|
||||
|
||||
document.querySelectorAll('[data-back]')
|
||||
.forEach(button => button.addEventListener(
|
||||
'click',
|
||||
this.back)
|
||||
);
|
||||
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)
|
||||
|
||||
))
|
||||
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))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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,60 +121,56 @@ 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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Show form.
|
||||
*
|
||||
*
|
||||
* @param {Event} event
|
||||
* @return {undefined}
|
||||
*/
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
})();
|
|
@ -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);
|
||||
}
|
||||
}();
|
||||
})();
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
}();
|
||||
|
||||
})();
|
||||
|
|
273
bookwyrm/templates/annual_summary/layout.html
Normal file
273
bookwyrm/templates/annual_summary/layout.html
Normal 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 won’t 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 }} didn’t 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 "That’s 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 doesn’t have pages)
|
||||
{% plural %}
|
||||
({{ no_page_number }} books don’t 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 %}
|
|
@ -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">
|
||||
|
|
12
bookwyrm/templates/book/cover_show_modal.html
Normal file
12
bookwyrm/templates/book/cover_show_modal.html
Normal 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>
|
|
@ -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"
|
||||
|
|
|
@ -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 #}
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
31
bookwyrm/templates/feed/summary_card.html
Normal file
31
bookwyrm/templates/feed/summary_card.html
Normal 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>
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -234,7 +234,3 @@
|
|||
</div>
|
||||
{% endif %}
|
||||
{% endspaceless %}{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
<script src="{% static "js/check_all.js" %}?v={{ js_cache }}"></script>
|
||||
{% endblock %}
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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!' %}"
|
||||
><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 }}"></iframe></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
|
|
@ -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' %}">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}>
|
||||
|
|
|
@ -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 %}>
|
||||
|
|
|
@ -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
|
||||
|
|
|
|
@ -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")
|
||||
|
|
|
@ -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")
|
||||
|
|
1
bookwyrm/tests/templatetags/__init__.py
Normal file
1
bookwyrm/tests/templatetags/__init__.py
Normal file
|
@ -0,0 +1 @@
|
|||
from . import *
|
101
bookwyrm/tests/templatetags/test_bookwyrm_tags.py
Normal file
101
bookwyrm/tests/templatetags/test_bookwyrm_tags.py
Normal 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)
|
53
bookwyrm/tests/templatetags/test_interaction.py
Normal file
53
bookwyrm/tests/templatetags/test_interaction.py
Normal 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))
|
15
bookwyrm/tests/templatetags/test_markdown.py
Normal file
15
bookwyrm/tests/templatetags/test_markdown.py
Normal 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>")
|
90
bookwyrm/tests/templatetags/test_status_display.py
Normal file
90
bookwyrm/tests/templatetags/test_status_display.py
Normal 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 ")
|
59
bookwyrm/tests/templatetags/test_utilities.py
Normal file
59
bookwyrm/tests/templatetags/test_utilities.py
Normal 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")
|
|
@ -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")
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
142
bookwyrm/tests/views/test_annual_summary.py
Normal file
142
bookwyrm/tests/views/test_annual_summary.py
Normal 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 DOESN’T 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 DOESN’T 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)
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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, *_):
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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})?"
|
||||
|
|
|
@ -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,
|
||||
)
|
||||
|
|
210
bookwyrm/views/annual_summary.py
Normal file
210
bookwyrm/views/annual_summary.py
Normal 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
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
25
bw-dev
|
@ -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]"
|
||||
;;
|
||||
|
|
|
@ -20,6 +20,7 @@ update_locales
|
|||
build
|
||||
clean
|
||||
black
|
||||
prettier
|
||||
populate_streams
|
||||
populate_suggestions
|
||||
generate_thumbnails
|
||||
|
|
Binary file not shown.
|
@ -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)s’s</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 won’t 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 didn’t 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 "That’s 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 doesn’t have pages)"
|
||||
msgid_plural "(%(no_page_number)s books don’t 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"
|
||||
|
||||
|
|
|
@ -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)s’s</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 won’t 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 didn’t 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 "That’s 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 doesn’t have pages)"
|
||||
msgid_plural "(%(no_page_number)s books don’t 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 & 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.
|
@ -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)s’s</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 won’t 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 didn’t 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 "That’s 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 doesn’t have pages)"
|
||||
msgid_plural "(%(no_page_number)s books don’t 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.
|
@ -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 n’est pas une remote_id valide."
|
|||
msgid "%(value)s is not a valid username"
|
||||
msgstr "%(value)s n’est 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 s’est 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)s’s</em> year of reading"
|
||||
msgstr "l’anné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 l’adresse"
|
||||
|
||||
#: 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 won’t 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, l’ancienne 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 didn’t finish any book in %(year)s"
|
||||
msgstr "Malheureusement, %(display_name)s n’a 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 "That’s great!"
|
||||
msgstr "C’est 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 doesn’t have pages)"
|
||||
msgid_plural "(%(no_page_number)s books don’t have pages)"
|
||||
msgstr[0] "(%(no_page_number)s livre n’a pas de pages)"
|
||||
msgstr[1] "(%(no_page_number)s livres n’ont pas de pages)"
|
||||
|
||||
#: bookwyrm/templates/annual_summary/layout.html:148
|
||||
msgid "Their shortest read this year…"
|
||||
msgstr "Sa lecture la plus courte l’anné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 à n’importe 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 n’avez 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 l’administrateur 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 l’instant ! Abonnez‑vous à quelqu’un 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 d’activer plus de types de statuts"
|
||||
|
||||
|
@ -1206,7 +1331,7 @@ msgstr "Vous pouvez définir ou changer votre défi lecture à n’importe 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 lisez‑vous ?"
|
||||
|
||||
#: 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 ! L’adresse 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 d’actualité"
|
||||
|
||||
#: 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 : 10 Mo"
|
|||
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.
|
@ -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)s’s</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 won’t 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 didn’t 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 "That’s 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 doesn’t have pages)"
|
||||
msgid_plural "(%(no_page_number)s books don’t 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.
|
@ -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)s’s</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 won’t 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 didn’t 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 "That’s 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 doesn’t have pages)"
|
||||
msgid_plural "(%(no_page_number)s books don’t 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.
|
@ -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)s’s</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 won’t 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 didn’t 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 "That’s 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 doesn’t have pages)"
|
||||
msgid_plural "(%(no_page_number)s books don’t 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.
|
@ -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)s’s</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 won’t 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 didn’t 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 "That’s 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 doesn’t have pages)"
|
||||
msgid_plural "(%(no_page_number)s books don’t 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.
|
@ -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)s’s</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 won’t 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 didn’t 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 "That’s 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 doesn’t have pages)"
|
||||
msgid_plural "(%(no_page_number)s books don’t 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 檔案"
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue