mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2025-01-22 15:08:07 +00:00
Merge branch 'main' into production
This commit is contained in:
commit
8f50f8758c
52 changed files with 1982 additions and 1155 deletions
|
@ -213,7 +213,7 @@ class ActivityObject:
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="medium_priority")
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def set_related_field(
|
def set_related_field(
|
||||||
model_name, origin_model_name, related_field_name, related_remote_id, data
|
model_name, origin_model_name, related_field_name, related_remote_id, data
|
||||||
|
|
|
@ -395,7 +395,7 @@ def remove_statuses_on_unshelve(sender, instance, *args, **kwargs):
|
||||||
# ---- TASKS
|
# ---- TASKS
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="low_priority")
|
||||||
def add_book_statuses_task(user_id, book_id):
|
def add_book_statuses_task(user_id, book_id):
|
||||||
"""add statuses related to a book on shelve"""
|
"""add statuses related to a book on shelve"""
|
||||||
user = models.User.objects.get(id=user_id)
|
user = models.User.objects.get(id=user_id)
|
||||||
|
@ -403,7 +403,7 @@ def add_book_statuses_task(user_id, book_id):
|
||||||
BooksStream().add_book_statuses(user, book)
|
BooksStream().add_book_statuses(user, book)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="low_priority")
|
||||||
def remove_book_statuses_task(user_id, book_id):
|
def remove_book_statuses_task(user_id, book_id):
|
||||||
"""remove statuses about a book from a user's books feed"""
|
"""remove statuses about a book from a user's books feed"""
|
||||||
user = models.User.objects.get(id=user_id)
|
user = models.User.objects.get(id=user_id)
|
||||||
|
@ -411,7 +411,7 @@ def remove_book_statuses_task(user_id, book_id):
|
||||||
BooksStream().remove_book_statuses(user, book)
|
BooksStream().remove_book_statuses(user, book)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="medium_priority")
|
||||||
def populate_stream_task(stream, user_id):
|
def populate_stream_task(stream, user_id):
|
||||||
"""background task for populating an empty activitystream"""
|
"""background task for populating an empty activitystream"""
|
||||||
user = models.User.objects.get(id=user_id)
|
user = models.User.objects.get(id=user_id)
|
||||||
|
@ -419,7 +419,7 @@ def populate_stream_task(stream, user_id):
|
||||||
stream.populate_streams(user)
|
stream.populate_streams(user)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="medium_priority")
|
||||||
def remove_status_task(status_ids):
|
def remove_status_task(status_ids):
|
||||||
"""remove a status from any stream it might be in"""
|
"""remove a status from any stream it might be in"""
|
||||||
# this can take an id or a list of ids
|
# this can take an id or a list of ids
|
||||||
|
@ -432,7 +432,7 @@ def remove_status_task(status_ids):
|
||||||
stream.remove_object_from_related_stores(status)
|
stream.remove_object_from_related_stores(status)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="medium_priority")
|
||||||
def add_status_task(status_id, increment_unread=False):
|
def add_status_task(status_id, increment_unread=False):
|
||||||
"""remove a status from any stream it might be in"""
|
"""remove a status from any stream it might be in"""
|
||||||
status = models.Status.objects.get(id=status_id)
|
status = models.Status.objects.get(id=status_id)
|
||||||
|
@ -440,7 +440,7 @@ def add_status_task(status_id, increment_unread=False):
|
||||||
stream.add_status(status, increment_unread=increment_unread)
|
stream.add_status(status, increment_unread=increment_unread)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="medium_priority")
|
||||||
def remove_user_statuses_task(viewer_id, user_id, stream_list=None):
|
def remove_user_statuses_task(viewer_id, user_id, stream_list=None):
|
||||||
"""remove all statuses by a user from a viewer's stream"""
|
"""remove all statuses by a user from a viewer's stream"""
|
||||||
stream_list = [streams[s] for s in stream_list] if stream_list else streams.values()
|
stream_list = [streams[s] for s in stream_list] if stream_list else streams.values()
|
||||||
|
@ -450,9 +450,9 @@ def remove_user_statuses_task(viewer_id, user_id, stream_list=None):
|
||||||
stream.remove_user_statuses(viewer, user)
|
stream.remove_user_statuses(viewer, user)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="medium_priority")
|
||||||
def add_user_statuses_task(viewer_id, user_id, stream_list=None):
|
def add_user_statuses_task(viewer_id, user_id, stream_list=None):
|
||||||
"""remove all statuses by a user from a viewer's stream"""
|
"""add all statuses by a user to a viewer's stream"""
|
||||||
stream_list = [streams[s] for s in stream_list] if stream_list else streams.values()
|
stream_list = [streams[s] for s in stream_list] if stream_list else streams.values()
|
||||||
viewer = models.User.objects.get(id=viewer_id)
|
viewer = models.User.objects.get(id=viewer_id)
|
||||||
user = models.User.objects.get(id=user_id)
|
user = models.User.objects.get(id=user_id)
|
||||||
|
@ -460,7 +460,7 @@ def add_user_statuses_task(viewer_id, user_id, stream_list=None):
|
||||||
stream.add_user_statuses(viewer, user)
|
stream.add_user_statuses(viewer, user)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="medium_priority")
|
||||||
def handle_boost_task(boost_id):
|
def handle_boost_task(boost_id):
|
||||||
"""remove the original post and other, earlier boosts"""
|
"""remove the original post and other, earlier boosts"""
|
||||||
instance = models.Status.objects.get(id=boost_id)
|
instance = models.Status.objects.get(id=boost_id)
|
||||||
|
|
|
@ -119,7 +119,7 @@ def get_or_create_connector(remote_id):
|
||||||
return load_connector(connector_info)
|
return load_connector(connector_info)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="low_priority")
|
||||||
def load_more_data(connector_id, book_id):
|
def load_more_data(connector_id, book_id):
|
||||||
"""background the work of getting all 10,000 editions of LoTR"""
|
"""background the work of getting all 10,000 editions of LoTR"""
|
||||||
connector_info = models.Connector.objects.get(id=connector_id)
|
connector_info = models.Connector.objects.get(id=connector_id)
|
||||||
|
|
|
@ -64,7 +64,7 @@ def format_email(email_name, data):
|
||||||
return (subject, html_content, text_content)
|
return (subject, html_content, text_content)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="high_priority")
|
||||||
def send_email(recipient, subject, html_content, text_content):
|
def send_email(recipient, subject, html_content, text_content):
|
||||||
"""use a task to send the email"""
|
"""use a task to send the email"""
|
||||||
email = EmailMultiAlternatives(
|
email = EmailMultiAlternatives(
|
||||||
|
|
|
@ -61,7 +61,7 @@ class Importer:
|
||||||
job.save()
|
job.save()
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="low_priority")
|
||||||
def import_data(source, job_id):
|
def import_data(source, job_id):
|
||||||
"""does the actual lookup work in a celery task"""
|
"""does the actual lookup work in a celery task"""
|
||||||
job = ImportJob.objects.get(id=job_id)
|
job = ImportJob.objects.get(id=job_id)
|
||||||
|
|
|
@ -502,7 +502,7 @@ def unfurl_related_field(related_field, sort_field=None):
|
||||||
return related_field.remote_id
|
return related_field.remote_id
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="medium_priority")
|
||||||
def broadcast_task(sender_id, activity, recipients):
|
def broadcast_task(sender_id, activity, recipients):
|
||||||
"""the celery task for broadcast"""
|
"""the celery task for broadcast"""
|
||||||
user_model = apps.get_model("bookwyrm.User", require_ready=True)
|
user_model = apps.get_model("bookwyrm.User", require_ready=True)
|
||||||
|
|
|
@ -174,6 +174,7 @@ class ImportItem(models.Model):
|
||||||
if start_date and start_date is not None and not self.date_read:
|
if start_date and start_date is not None and not self.date_read:
|
||||||
return [ReadThrough(start_date=start_date)]
|
return [ReadThrough(start_date=start_date)]
|
||||||
if self.date_read:
|
if self.date_read:
|
||||||
|
start_date = start_date if start_date < self.date_read else None
|
||||||
return [
|
return [
|
||||||
ReadThrough(
|
ReadThrough(
|
||||||
start_date=start_date,
|
start_date=start_date,
|
||||||
|
|
|
@ -274,6 +274,7 @@ class User(OrderedCollectionPageMixin, AbstractUser):
|
||||||
transaction.on_commit(lambda: set_remote_server.delay(self.id))
|
transaction.on_commit(lambda: set_remote_server.delay(self.id))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
with transaction.atomic():
|
||||||
# populate fields for local users
|
# populate fields for local users
|
||||||
link = site_link()
|
link = site_link()
|
||||||
self.remote_id = f"{link}/user/{self.localname}"
|
self.remote_id = f"{link}/user/{self.localname}"
|
||||||
|
@ -294,10 +295,25 @@ class User(OrderedCollectionPageMixin, AbstractUser):
|
||||||
|
|
||||||
# create keys and shelves for new local users
|
# create keys and shelves for new local users
|
||||||
self.key_pair = KeyPair.objects.create(
|
self.key_pair = KeyPair.objects.create(
|
||||||
remote_id="%s/#main-key" % self.remote_id
|
remote_id=f"{self.remote_id}/#main-key"
|
||||||
)
|
)
|
||||||
self.save(broadcast=False, update_fields=["key_pair"])
|
self.save(broadcast=False, update_fields=["key_pair"])
|
||||||
|
|
||||||
|
self.create_shelves()
|
||||||
|
|
||||||
|
def delete(self, *args, **kwargs):
|
||||||
|
"""deactivate rather than delete a user"""
|
||||||
|
self.is_active = False
|
||||||
|
# skip the logic in this class's save()
|
||||||
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def local_path(self):
|
||||||
|
"""this model doesn't inherit bookwyrm model, so here we are"""
|
||||||
|
return "/user/%s" % (self.localname or self.username)
|
||||||
|
|
||||||
|
def create_shelves(self):
|
||||||
|
"""default shelves for a new user"""
|
||||||
shelves = [
|
shelves = [
|
||||||
{
|
{
|
||||||
"name": "To Read",
|
"name": "To Read",
|
||||||
|
@ -321,17 +337,6 @@ class User(OrderedCollectionPageMixin, AbstractUser):
|
||||||
editable=False,
|
editable=False,
|
||||||
).save(broadcast=False)
|
).save(broadcast=False)
|
||||||
|
|
||||||
def delete(self, *args, **kwargs):
|
|
||||||
"""deactivate rather than delete a user"""
|
|
||||||
self.is_active = False
|
|
||||||
# skip the logic in this class's save()
|
|
||||||
super().save(*args, **kwargs)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def local_path(self):
|
|
||||||
"""this model doesn't inherit bookwyrm model, so here we are"""
|
|
||||||
return "/user/%s" % (self.localname or self.username)
|
|
||||||
|
|
||||||
|
|
||||||
class KeyPair(ActivitypubMixin, BookWyrmModel):
|
class KeyPair(ActivitypubMixin, BookWyrmModel):
|
||||||
"""public and private keys for a user"""
|
"""public and private keys for a user"""
|
||||||
|
@ -420,7 +425,7 @@ class AnnualGoal(BookWyrmModel):
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="low_priority")
|
||||||
def set_remote_server(user_id):
|
def set_remote_server(user_id):
|
||||||
"""figure out the user's remote server in the background"""
|
"""figure out the user's remote server in the background"""
|
||||||
user = User.objects.get(id=user_id)
|
user = User.objects.get(id=user_id)
|
||||||
|
@ -459,7 +464,7 @@ def get_or_create_remote_server(domain):
|
||||||
return server
|
return server
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="low_priority")
|
||||||
def get_remote_reviews(outbox):
|
def get_remote_reviews(outbox):
|
||||||
"""ingest reviews by a new remote bookwyrm user"""
|
"""ingest reviews by a new remote bookwyrm user"""
|
||||||
outbox_page = outbox + "?page=true&type=Review"
|
outbox_page = outbox + "?page=true&type=Review"
|
||||||
|
|
|
@ -352,7 +352,7 @@ def save_and_cleanup(image, instance=None):
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=invalid-name
|
# pylint: disable=invalid-name
|
||||||
@app.task
|
@app.task(queue="low_priority")
|
||||||
def generate_site_preview_image_task():
|
def generate_site_preview_image_task():
|
||||||
"""generate preview_image for the website"""
|
"""generate preview_image for the website"""
|
||||||
if not settings.ENABLE_PREVIEW_IMAGES:
|
if not settings.ENABLE_PREVIEW_IMAGES:
|
||||||
|
@ -377,7 +377,7 @@ def generate_site_preview_image_task():
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=invalid-name
|
# pylint: disable=invalid-name
|
||||||
@app.task
|
@app.task(queue="low_priority")
|
||||||
def generate_edition_preview_image_task(book_id):
|
def generate_edition_preview_image_task(book_id):
|
||||||
"""generate preview_image for a book"""
|
"""generate preview_image for a book"""
|
||||||
if not settings.ENABLE_PREVIEW_IMAGES:
|
if not settings.ENABLE_PREVIEW_IMAGES:
|
||||||
|
@ -402,7 +402,7 @@ def generate_edition_preview_image_task(book_id):
|
||||||
save_and_cleanup(image, instance=book)
|
save_and_cleanup(image, instance=book)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="low_priority")
|
||||||
def generate_user_preview_image_task(user_id):
|
def generate_user_preview_image_task(user_id):
|
||||||
"""generate preview_image for a book"""
|
"""generate preview_image for a book"""
|
||||||
if not settings.ENABLE_PREVIEW_IMAGES:
|
if not settings.ENABLE_PREVIEW_IMAGES:
|
||||||
|
|
|
@ -13,17 +13,6 @@ VERSION = "0.0.1"
|
||||||
PAGE_LENGTH = env("PAGE_LENGTH", 15)
|
PAGE_LENGTH = env("PAGE_LENGTH", 15)
|
||||||
DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English")
|
DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English")
|
||||||
|
|
||||||
# celery
|
|
||||||
CELERY_BROKER = "redis://:{}@redis_broker:{}/0".format(
|
|
||||||
requests.utils.quote(env("REDIS_BROKER_PASSWORD", "")), env("REDIS_BROKER_PORT")
|
|
||||||
)
|
|
||||||
CELERY_RESULT_BACKEND = "redis://:{}@redis_broker:{}/0".format(
|
|
||||||
requests.utils.quote(env("REDIS_BROKER_PASSWORD", "")), env("REDIS_BROKER_PORT")
|
|
||||||
)
|
|
||||||
CELERY_ACCEPT_CONTENT = ["application/json"]
|
|
||||||
CELERY_TASK_SERIALIZER = "json"
|
|
||||||
CELERY_RESULT_SERIALIZER = "json"
|
|
||||||
|
|
||||||
# email
|
# email
|
||||||
EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend")
|
EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend")
|
||||||
EMAIL_HOST = env("EMAIL_HOST")
|
EMAIL_HOST = env("EMAIL_HOST")
|
||||||
|
|
|
@ -96,7 +96,7 @@ body {
|
||||||
@see https://www.youtube.com/watch?v=9xXBYcWgCHA */
|
@see https://www.youtube.com/watch?v=9xXBYcWgCHA */
|
||||||
.shelf-option:disabled > *::after {
|
.shelf-option:disabled > *::after {
|
||||||
font-family: "icomoon"; /* stylelint-disable font-family-no-missing-generic-family-keyword */
|
font-family: "icomoon"; /* stylelint-disable font-family-no-missing-generic-family-keyword */
|
||||||
content: "\e918";
|
content: "\e919"; /* icon-check */
|
||||||
margin-left: 0.5em;
|
margin-left: 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,21 +167,21 @@ body {
|
||||||
|
|
||||||
/* All stars are visually filled by default. */
|
/* All stars are visually filled by default. */
|
||||||
.form-rate-stars .icon::before {
|
.form-rate-stars .icon::before {
|
||||||
content: '\e9d9';
|
content: '\e9d9'; /* icon-star-full */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Icons directly following inputs that follow the checked input are emptied. */
|
/* Icons directly following inputs that follow the checked input are emptied. */
|
||||||
.form-rate-stars input:checked ~ input + .icon::before {
|
.form-rate-stars input:checked ~ input + .icon::before {
|
||||||
content: '\e9d7';
|
content: '\e9d7'; /* icon-star-empty */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* When a label is hovered, repeat the fill-all-then-empty-following pattern. */
|
/* When a label is hovered, repeat the fill-all-then-empty-following pattern. */
|
||||||
.form-rate-stars:hover .icon.icon::before {
|
.form-rate-stars:hover .icon.icon::before {
|
||||||
content: '\e9d9';
|
content: '\e9d9'; /* icon-star-full */
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-rate-stars .icon:hover ~ .icon::before {
|
.form-rate-stars .icon:hover ~ .icon::before {
|
||||||
content: '\e9d7';
|
content: '\e9d7'; /* icon-star-empty */
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Book covers
|
/** Book covers
|
||||||
|
@ -292,13 +292,13 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
.quote > blockquote::before {
|
.quote > blockquote::before {
|
||||||
content: "\e906";
|
content: "\e907"; /* icon-quote-open */
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.quote > blockquote::after {
|
.quote > blockquote::after {
|
||||||
content: "\e905";
|
content: "\e906"; /* icon-quote-close */
|
||||||
right: 0;
|
right: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 33 KiB |
Binary file not shown.
Binary file not shown.
193
bookwyrm/static/css/vendor/icons.css
vendored
193
bookwyrm/static/css/vendor/icons.css
vendored
|
@ -1,10 +1,10 @@
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'icomoon';
|
font-family: 'icomoon';
|
||||||
src: url('../fonts/icomoon.eot?19nagi');
|
src: url('../fonts/icomoon.eot?wjd7rd');
|
||||||
src: url('../fonts/icomoon.eot?19nagi#iefix') format('embedded-opentype'),
|
src: url('../fonts/icomoon.eot?wjd7rd#iefix') format('embedded-opentype'),
|
||||||
url('../fonts/icomoon.ttf?19nagi') format('truetype'),
|
url('../fonts/icomoon.ttf?wjd7rd') format('truetype'),
|
||||||
url('../fonts/icomoon.woff?19nagi') format('woff'),
|
url('../fonts/icomoon.woff?wjd7rd') format('woff'),
|
||||||
url('../fonts/icomoon.svg?19nagi#icomoon') format('svg');
|
url('../fonts/icomoon.svg?wjd7rd#icomoon') format('svg');
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-display: block;
|
font-display: block;
|
||||||
|
@ -25,6 +25,90 @@
|
||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.icon-book:before {
|
||||||
|
content: "\e901";
|
||||||
|
}
|
||||||
|
.icon-envelope:before {
|
||||||
|
content: "\e902";
|
||||||
|
}
|
||||||
|
.icon-arrow-right:before {
|
||||||
|
content: "\e903";
|
||||||
|
}
|
||||||
|
.icon-bell:before {
|
||||||
|
content: "\e904";
|
||||||
|
}
|
||||||
|
.icon-x:before {
|
||||||
|
content: "\e905";
|
||||||
|
}
|
||||||
|
.icon-quote-close:before {
|
||||||
|
content: "\e906";
|
||||||
|
}
|
||||||
|
.icon-quote-open:before {
|
||||||
|
content: "\e907";
|
||||||
|
}
|
||||||
|
.icon-image:before {
|
||||||
|
content: "\e908";
|
||||||
|
}
|
||||||
|
.icon-pencil:before {
|
||||||
|
content: "\e909";
|
||||||
|
}
|
||||||
|
.icon-list:before {
|
||||||
|
content: "\e90a";
|
||||||
|
}
|
||||||
|
.icon-unlock:before {
|
||||||
|
content: "\e90b";
|
||||||
|
}
|
||||||
|
.icon-globe:before {
|
||||||
|
content: "\e90c";
|
||||||
|
}
|
||||||
|
.icon-lock:before {
|
||||||
|
content: "\e90d";
|
||||||
|
}
|
||||||
|
.icon-chain-broken:before {
|
||||||
|
content: "\e90e";
|
||||||
|
}
|
||||||
|
.icon-chain:before {
|
||||||
|
content: "\e90f";
|
||||||
|
}
|
||||||
|
.icon-comments:before {
|
||||||
|
content: "\e910";
|
||||||
|
}
|
||||||
|
.icon-comment:before {
|
||||||
|
content: "\e911";
|
||||||
|
}
|
||||||
|
.icon-boost:before {
|
||||||
|
content: "\e912";
|
||||||
|
}
|
||||||
|
.icon-arrow-left:before {
|
||||||
|
content: "\e913";
|
||||||
|
}
|
||||||
|
.icon-arrow-up:before {
|
||||||
|
content: "\e914";
|
||||||
|
}
|
||||||
|
.icon-arrow-down:before {
|
||||||
|
content: "\e915";
|
||||||
|
}
|
||||||
|
.icon-local:before {
|
||||||
|
content: "\e917";
|
||||||
|
}
|
||||||
|
.icon-dots-three:before {
|
||||||
|
content: "\e918";
|
||||||
|
}
|
||||||
|
.icon-check:before {
|
||||||
|
content: "\e919";
|
||||||
|
}
|
||||||
|
.icon-dots-three-vertical:before {
|
||||||
|
content: "\e91a";
|
||||||
|
}
|
||||||
|
.icon-bookmark:before {
|
||||||
|
content: "\e91b";
|
||||||
|
}
|
||||||
|
.icon-warning:before {
|
||||||
|
content: "\e91c";
|
||||||
|
}
|
||||||
|
.icon-rss:before {
|
||||||
|
content: "\e91d";
|
||||||
|
}
|
||||||
.icon-graphic-heart:before {
|
.icon-graphic-heart:before {
|
||||||
content: "\e91e";
|
content: "\e91e";
|
||||||
}
|
}
|
||||||
|
@ -34,102 +118,6 @@
|
||||||
.icon-graphic-banknote:before {
|
.icon-graphic-banknote:before {
|
||||||
content: "\e920";
|
content: "\e920";
|
||||||
}
|
}
|
||||||
.icon-warning:before {
|
|
||||||
content: "\e91b";
|
|
||||||
}
|
|
||||||
.icon-book:before {
|
|
||||||
content: "\e900";
|
|
||||||
}
|
|
||||||
.icon-bookmark:before {
|
|
||||||
content: "\e91a";
|
|
||||||
}
|
|
||||||
.icon-rss:before {
|
|
||||||
content: "\e91d";
|
|
||||||
}
|
|
||||||
.icon-envelope:before {
|
|
||||||
content: "\e901";
|
|
||||||
}
|
|
||||||
.icon-arrow-right:before {
|
|
||||||
content: "\e902";
|
|
||||||
}
|
|
||||||
.icon-bell:before {
|
|
||||||
content: "\e903";
|
|
||||||
}
|
|
||||||
.icon-x:before {
|
|
||||||
content: "\e904";
|
|
||||||
}
|
|
||||||
.icon-quote-close:before {
|
|
||||||
content: "\e905";
|
|
||||||
}
|
|
||||||
.icon-quote-open:before {
|
|
||||||
content: "\e906";
|
|
||||||
}
|
|
||||||
.icon-image:before {
|
|
||||||
content: "\e907";
|
|
||||||
}
|
|
||||||
.icon-pencil:before {
|
|
||||||
content: "\e908";
|
|
||||||
}
|
|
||||||
.icon-list:before {
|
|
||||||
content: "\e909";
|
|
||||||
}
|
|
||||||
.icon-unlock:before {
|
|
||||||
content: "\e90a";
|
|
||||||
}
|
|
||||||
.icon-unlisted:before {
|
|
||||||
content: "\e90a";
|
|
||||||
}
|
|
||||||
.icon-globe:before {
|
|
||||||
content: "\e90b";
|
|
||||||
}
|
|
||||||
.icon-public:before {
|
|
||||||
content: "\e90b";
|
|
||||||
}
|
|
||||||
.icon-lock:before {
|
|
||||||
content: "\e90c";
|
|
||||||
}
|
|
||||||
.icon-followers:before {
|
|
||||||
content: "\e90c";
|
|
||||||
}
|
|
||||||
.icon-chain-broken:before {
|
|
||||||
content: "\e90d";
|
|
||||||
}
|
|
||||||
.icon-chain:before {
|
|
||||||
content: "\e90e";
|
|
||||||
}
|
|
||||||
.icon-comments:before {
|
|
||||||
content: "\e90f";
|
|
||||||
}
|
|
||||||
.icon-comment:before {
|
|
||||||
content: "\e910";
|
|
||||||
}
|
|
||||||
.icon-boost:before {
|
|
||||||
content: "\e911";
|
|
||||||
}
|
|
||||||
.icon-arrow-left:before {
|
|
||||||
content: "\e912";
|
|
||||||
}
|
|
||||||
.icon-arrow-up:before {
|
|
||||||
content: "\e913";
|
|
||||||
}
|
|
||||||
.icon-arrow-down:before {
|
|
||||||
content: "\e914";
|
|
||||||
}
|
|
||||||
.icon-home:before {
|
|
||||||
content: "\e915";
|
|
||||||
}
|
|
||||||
.icon-local:before {
|
|
||||||
content: "\e916";
|
|
||||||
}
|
|
||||||
.icon-dots-three:before {
|
|
||||||
content: "\e917";
|
|
||||||
}
|
|
||||||
.icon-check:before {
|
|
||||||
content: "\e918";
|
|
||||||
}
|
|
||||||
.icon-dots-three-vertical:before {
|
|
||||||
content: "\e919";
|
|
||||||
}
|
|
||||||
.icon-search:before {
|
.icon-search:before {
|
||||||
content: "\e986";
|
content: "\e986";
|
||||||
}
|
}
|
||||||
|
@ -148,3 +136,6 @@
|
||||||
.icon-plus:before {
|
.icon-plus:before {
|
||||||
content: "\ea0a";
|
content: "\ea0a";
|
||||||
}
|
}
|
||||||
|
.icon-question-circle:before {
|
||||||
|
content: "\e900";
|
||||||
|
}
|
||||||
|
|
|
@ -194,27 +194,27 @@ def add_new_user(sender, instance, created, update_fields=None, **kwargs):
|
||||||
remove_user_task.delay(instance.id)
|
remove_user_task.delay(instance.id)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="low_priority")
|
||||||
def rerank_suggestions_task(user_id):
|
def rerank_suggestions_task(user_id):
|
||||||
"""do the hard work in celery"""
|
"""do the hard work in celery"""
|
||||||
suggested_users.rerank_user_suggestions(user_id)
|
suggested_users.rerank_user_suggestions(user_id)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="low_priority")
|
||||||
def rerank_user_task(user_id, update_only=False):
|
def rerank_user_task(user_id, update_only=False):
|
||||||
"""do the hard work in celery"""
|
"""do the hard work in celery"""
|
||||||
user = models.User.objects.get(id=user_id)
|
user = models.User.objects.get(id=user_id)
|
||||||
suggested_users.rerank_obj(user, update_only=update_only)
|
suggested_users.rerank_obj(user, update_only=update_only)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="low_priority")
|
||||||
def remove_user_task(user_id):
|
def remove_user_task(user_id):
|
||||||
"""do the hard work in celery"""
|
"""do the hard work in celery"""
|
||||||
user = models.User.objects.get(id=user_id)
|
user = models.User.objects.get(id=user_id)
|
||||||
suggested_users.remove_object_from_related_stores(user)
|
suggested_users.remove_object_from_related_stores(user)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="medium_priority")
|
||||||
def remove_suggestion_task(user_id, suggested_user_id):
|
def remove_suggestion_task(user_id, suggested_user_id):
|
||||||
"""remove a specific user from a specific user's suggestions"""
|
"""remove a specific user from a specific user's suggestions"""
|
||||||
suggested_user = models.User.objects.get(id=suggested_user_id)
|
suggested_user = models.User.objects.get(id=suggested_user_id)
|
||||||
|
|
|
@ -2,10 +2,10 @@
|
||||||
import os
|
import os
|
||||||
from celery import Celery
|
from celery import Celery
|
||||||
|
|
||||||
from bookwyrm import settings
|
from celerywyrm import settings
|
||||||
|
|
||||||
# set the default Django settings module for the 'celery' program.
|
# set the default Django settings module for the 'celery' program.
|
||||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "celerywyrm.settings")
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "celerywyrm.settings")
|
||||||
app = Celery(
|
app = Celery(
|
||||||
"tasks", broker=settings.CELERY_BROKER, backend=settings.CELERY_RESULT_BACKEND
|
"tasks", broker=settings.CELERY_BROKER_URL, backend=settings.CELERY_RESULT_BACKEND
|
||||||
)
|
)
|
||||||
|
|
11
bookwyrm/templates/components/tooltip.html
Normal file
11
bookwyrm/templates/components/tooltip.html
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% trans "Help" as button_text %}
|
||||||
|
{% include 'snippets/toggle/open_button.html' with text=button_text class="ml-3 is-rounded is-small is-white p-0 pb-1" icon="question-circle is-size-6" controls_text=controls_text controls_uid=controls_uid %}
|
||||||
|
|
||||||
|
<aside class="notification is-hidden transition-y is-pulled-left mb-2" id="{{ controls_text }}{% if controls_uid %}-{{ controls_uid }}{% endif %}">
|
||||||
|
{% trans "Close" as button_text %}
|
||||||
|
{% include 'snippets/toggle/close_button.html' with label=button_text class="delete" nonbutton=True controls_text=controls_text controls_uid=controls_uid %}
|
||||||
|
|
||||||
|
{% block tooltip_content %}{% endblock %}
|
||||||
|
</aside>
|
|
@ -12,9 +12,14 @@
|
||||||
|
|
||||||
<div class="columns">
|
<div class="columns">
|
||||||
<div class="column is-half">
|
<div class="column is-half">
|
||||||
<label class="label" for="source">
|
|
||||||
|
<div class="field">
|
||||||
|
<label class="label is-pulled-left" for="source">
|
||||||
{% trans "Data source:" %}
|
{% trans "Data source:" %}
|
||||||
</label>
|
</label>
|
||||||
|
{% include 'import/tooltip.html' with controls_text="goodreads-tooltip" %}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="select block">
|
<div class="select block">
|
||||||
<select name="source" id="source">
|
<select name="source" id="source">
|
||||||
<option value="GoodReads" {% if current == 'GoodReads' %}selected{% endif %}>
|
<option value="GoodReads" {% if current == 'GoodReads' %}selected{% endif %}>
|
|
@ -40,7 +40,7 @@
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<h2 class="title is-4">{% trans "Failed to load" %}</h2>
|
<h2 class="title is-4">{% trans "Failed to load" %}</h2>
|
||||||
{% if not job.retry %}
|
{% if not job.retry %}
|
||||||
<form name="retry" action="/import/{{ job.id }}" method="post">
|
<form name="retry" action="/import/{{ job.id }}" method="post" class="box">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
|
||||||
{% with failed_count=failed_items|length %}
|
{% with failed_count=failed_items|length %}
|
8
bookwyrm/templates/import/tooltip.html
Normal file
8
bookwyrm/templates/import/tooltip.html
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{% extends 'components/tooltip.html' %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block tooltip_content %}
|
||||||
|
|
||||||
|
{% trans 'You can download your GoodReads data from the <a href="https://www.goodreads.com/review/import" target="_blank" rel="noopener">Import/Export page</a> of your GoodReads account.' %}
|
||||||
|
|
||||||
|
{% endblock %}
|
1
bookwyrm/tests/activitystreams/__init__.py
Normal file
1
bookwyrm/tests/activitystreams/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
from . import *
|
145
bookwyrm/tests/activitystreams/test_abstractstream.py
Normal file
145
bookwyrm/tests/activitystreams/test_abstractstream.py
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
""" testing activitystreams """
|
||||||
|
from unittest.mock import patch
|
||||||
|
from django.test import TestCase
|
||||||
|
from bookwyrm import activitystreams, models
|
||||||
|
|
||||||
|
|
||||||
|
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
|
||||||
|
@patch("bookwyrm.activitystreams.add_status_task.delay")
|
||||||
|
@patch("bookwyrm.activitystreams.add_book_statuses_task.delay")
|
||||||
|
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
|
||||||
|
@patch("bookwyrm.activitystreams.populate_stream_task.delay")
|
||||||
|
class Activitystreams(TestCase):
|
||||||
|
"""using redis to build activity streams"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
"""use a test csv"""
|
||||||
|
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", "mouse@mouse.mouse", "password", local=True, localname="mouse"
|
||||||
|
)
|
||||||
|
self.another_user = models.User.objects.create_user(
|
||||||
|
"nutria",
|
||||||
|
"nutria@nutria.nutria",
|
||||||
|
"password",
|
||||||
|
local=True,
|
||||||
|
localname="nutria",
|
||||||
|
)
|
||||||
|
with patch("bookwyrm.models.user.set_remote_server.delay"):
|
||||||
|
self.remote_user = models.User.objects.create_user(
|
||||||
|
"rat",
|
||||||
|
"rat@rat.com",
|
||||||
|
"ratword",
|
||||||
|
local=False,
|
||||||
|
remote_id="https://example.com/users/rat",
|
||||||
|
inbox="https://example.com/users/rat/inbox",
|
||||||
|
outbox="https://example.com/users/rat/outbox",
|
||||||
|
)
|
||||||
|
work = models.Work.objects.create(title="test work")
|
||||||
|
self.book = models.Edition.objects.create(title="test book", parent_work=work)
|
||||||
|
|
||||||
|
class TestStream(activitystreams.ActivityStream):
|
||||||
|
"""test stream, don't have to do anything here"""
|
||||||
|
|
||||||
|
key = "test"
|
||||||
|
|
||||||
|
self.test_stream = TestStream()
|
||||||
|
|
||||||
|
def test_activitystream_class_ids(self, *_):
|
||||||
|
"""the abstract base class for stream objects"""
|
||||||
|
self.assertEqual(
|
||||||
|
self.test_stream.stream_id(self.local_user),
|
||||||
|
"{}-test".format(self.local_user.id),
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
self.test_stream.unread_id(self.local_user),
|
||||||
|
"{}-test-unread".format(self.local_user.id),
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_abstractstream_get_audience(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
status = models.Status.objects.create(
|
||||||
|
user=self.remote_user, content="hi", privacy="public"
|
||||||
|
)
|
||||||
|
users = self.test_stream.get_audience(status)
|
||||||
|
# remote users don't have feeds
|
||||||
|
self.assertFalse(self.remote_user in users)
|
||||||
|
self.assertTrue(self.local_user in users)
|
||||||
|
self.assertTrue(self.another_user in users)
|
||||||
|
|
||||||
|
def test_abstractstream_get_audience_direct(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
status = models.Status.objects.create(
|
||||||
|
user=self.remote_user,
|
||||||
|
content="hi",
|
||||||
|
privacy="direct",
|
||||||
|
)
|
||||||
|
status.mention_users.add(self.local_user)
|
||||||
|
users = self.test_stream.get_audience(status)
|
||||||
|
self.assertEqual(users, [])
|
||||||
|
|
||||||
|
status = models.Comment.objects.create(
|
||||||
|
user=self.remote_user,
|
||||||
|
content="hi",
|
||||||
|
privacy="direct",
|
||||||
|
book=self.book,
|
||||||
|
)
|
||||||
|
status.mention_users.add(self.local_user)
|
||||||
|
users = self.test_stream.get_audience(status)
|
||||||
|
self.assertTrue(self.local_user in users)
|
||||||
|
self.assertFalse(self.another_user in users)
|
||||||
|
self.assertFalse(self.remote_user in users)
|
||||||
|
|
||||||
|
def test_abstractstream_get_audience_followers_remote_user(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
status = models.Status.objects.create(
|
||||||
|
user=self.remote_user,
|
||||||
|
content="hi",
|
||||||
|
privacy="followers",
|
||||||
|
)
|
||||||
|
users = self.test_stream.get_audience(status)
|
||||||
|
self.assertFalse(users.exists())
|
||||||
|
|
||||||
|
def test_abstractstream_get_audience_followers_self(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
status = models.Comment.objects.create(
|
||||||
|
user=self.local_user,
|
||||||
|
content="hi",
|
||||||
|
privacy="direct",
|
||||||
|
book=self.book,
|
||||||
|
)
|
||||||
|
users = self.test_stream.get_audience(status)
|
||||||
|
self.assertTrue(self.local_user in users)
|
||||||
|
self.assertFalse(self.another_user in users)
|
||||||
|
self.assertFalse(self.remote_user in users)
|
||||||
|
|
||||||
|
def test_abstractstream_get_audience_followers_with_mention(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
status = models.Comment.objects.create(
|
||||||
|
user=self.remote_user,
|
||||||
|
content="hi",
|
||||||
|
privacy="direct",
|
||||||
|
book=self.book,
|
||||||
|
)
|
||||||
|
status.mention_users.add(self.local_user)
|
||||||
|
|
||||||
|
users = self.test_stream.get_audience(status)
|
||||||
|
self.assertTrue(self.local_user in users)
|
||||||
|
self.assertFalse(self.another_user in users)
|
||||||
|
self.assertFalse(self.remote_user in users)
|
||||||
|
|
||||||
|
def test_abstractstream_get_audience_followers_with_relationship(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
self.remote_user.followers.add(self.local_user)
|
||||||
|
status = models.Comment.objects.create(
|
||||||
|
user=self.remote_user,
|
||||||
|
content="hi",
|
||||||
|
privacy="direct",
|
||||||
|
book=self.book,
|
||||||
|
)
|
||||||
|
users = self.test_stream.get_audience(status)
|
||||||
|
self.assertFalse(self.local_user in users)
|
||||||
|
self.assertFalse(self.another_user in users)
|
||||||
|
self.assertFalse(self.remote_user in users)
|
54
bookwyrm/tests/activitystreams/test_booksstream.py
Normal file
54
bookwyrm/tests/activitystreams/test_booksstream.py
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
""" testing activitystreams """
|
||||||
|
from unittest.mock import patch
|
||||||
|
from django.test import TestCase
|
||||||
|
from bookwyrm import activitystreams, models
|
||||||
|
|
||||||
|
|
||||||
|
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
|
||||||
|
@patch("bookwyrm.activitystreams.add_status_task.delay")
|
||||||
|
@patch("bookwyrm.activitystreams.add_book_statuses_task.delay")
|
||||||
|
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
|
||||||
|
@patch("bookwyrm.activitystreams.populate_stream_task.delay")
|
||||||
|
class Activitystreams(TestCase):
|
||||||
|
"""using redis to build activity streams"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
"""use a test csv"""
|
||||||
|
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", "mouse@mouse.mouse", "password", local=True, localname="mouse"
|
||||||
|
)
|
||||||
|
with patch("bookwyrm.models.user.set_remote_server.delay"):
|
||||||
|
self.remote_user = models.User.objects.create_user(
|
||||||
|
"rat",
|
||||||
|
"rat@rat.com",
|
||||||
|
"ratword",
|
||||||
|
local=False,
|
||||||
|
remote_id="https://example.com/users/rat",
|
||||||
|
inbox="https://example.com/users/rat/inbox",
|
||||||
|
outbox="https://example.com/users/rat/outbox",
|
||||||
|
)
|
||||||
|
work = models.Work.objects.create(title="test work")
|
||||||
|
self.book = models.Edition.objects.create(title="test book", parent_work=work)
|
||||||
|
|
||||||
|
def test_get_statuses_for_user_books(self, *_):
|
||||||
|
"""create a stream for a user"""
|
||||||
|
alt_book = models.Edition.objects.create(
|
||||||
|
title="hi", parent_work=self.book.parent_work
|
||||||
|
)
|
||||||
|
status = models.Status.objects.create(
|
||||||
|
user=self.local_user, content="hi", privacy="public"
|
||||||
|
)
|
||||||
|
status = models.Comment.objects.create(
|
||||||
|
user=self.remote_user, content="hi", privacy="public", book=alt_book
|
||||||
|
)
|
||||||
|
models.ShelfBook.objects.create(
|
||||||
|
user=self.local_user,
|
||||||
|
shelf=self.local_user.shelf_set.first(),
|
||||||
|
book=self.book,
|
||||||
|
)
|
||||||
|
# yes book, yes audience
|
||||||
|
result = activitystreams.BooksStream().get_statuses_for_user(self.local_user)
|
||||||
|
self.assertEqual(list(result), [status])
|
67
bookwyrm/tests/activitystreams/test_homestream.py
Normal file
67
bookwyrm/tests/activitystreams/test_homestream.py
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
""" testing activitystreams """
|
||||||
|
from unittest.mock import patch
|
||||||
|
from django.test import TestCase
|
||||||
|
from bookwyrm import activitystreams, models
|
||||||
|
|
||||||
|
|
||||||
|
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
|
||||||
|
@patch("bookwyrm.activitystreams.add_status_task.delay")
|
||||||
|
@patch("bookwyrm.activitystreams.add_book_statuses_task.delay")
|
||||||
|
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
|
||||||
|
@patch("bookwyrm.activitystreams.populate_stream_task.delay")
|
||||||
|
class Activitystreams(TestCase):
|
||||||
|
"""using redis to build activity streams"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
"""use a test csv"""
|
||||||
|
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", "mouse@mouse.mouse", "password", local=True, localname="mouse"
|
||||||
|
)
|
||||||
|
self.another_user = models.User.objects.create_user(
|
||||||
|
"nutria",
|
||||||
|
"nutria@nutria.nutria",
|
||||||
|
"password",
|
||||||
|
local=True,
|
||||||
|
localname="nutria",
|
||||||
|
)
|
||||||
|
with patch("bookwyrm.models.user.set_remote_server.delay"):
|
||||||
|
self.remote_user = models.User.objects.create_user(
|
||||||
|
"rat",
|
||||||
|
"rat@rat.com",
|
||||||
|
"ratword",
|
||||||
|
local=False,
|
||||||
|
remote_id="https://example.com/users/rat",
|
||||||
|
inbox="https://example.com/users/rat/inbox",
|
||||||
|
outbox="https://example.com/users/rat/outbox",
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_homestream_get_audience(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
status = models.Status.objects.create(
|
||||||
|
user=self.remote_user, content="hi", privacy="public"
|
||||||
|
)
|
||||||
|
users = activitystreams.HomeStream().get_audience(status)
|
||||||
|
self.assertFalse(users.exists())
|
||||||
|
|
||||||
|
def test_homestream_get_audience_with_mentions(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
status = models.Status.objects.create(
|
||||||
|
user=self.remote_user, content="hi", privacy="public"
|
||||||
|
)
|
||||||
|
status.mention_users.add(self.local_user)
|
||||||
|
users = activitystreams.HomeStream().get_audience(status)
|
||||||
|
self.assertFalse(self.local_user in users)
|
||||||
|
self.assertFalse(self.another_user in users)
|
||||||
|
|
||||||
|
def test_homestream_get_audience_with_relationship(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
self.remote_user.followers.add(self.local_user)
|
||||||
|
status = models.Status.objects.create(
|
||||||
|
user=self.remote_user, content="hi", privacy="public"
|
||||||
|
)
|
||||||
|
users = activitystreams.HomeStream().get_audience(status)
|
||||||
|
self.assertTrue(self.local_user in users)
|
||||||
|
self.assertFalse(self.another_user in users)
|
139
bookwyrm/tests/activitystreams/test_localstream.py
Normal file
139
bookwyrm/tests/activitystreams/test_localstream.py
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
""" testing activitystreams """
|
||||||
|
from unittest.mock import patch
|
||||||
|
from django.test import TestCase
|
||||||
|
from bookwyrm import activitystreams, models
|
||||||
|
|
||||||
|
|
||||||
|
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
|
||||||
|
@patch("bookwyrm.activitystreams.add_status_task.delay")
|
||||||
|
@patch("bookwyrm.activitystreams.add_book_statuses_task.delay")
|
||||||
|
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
|
||||||
|
@patch("bookwyrm.activitystreams.populate_stream_task.delay")
|
||||||
|
class Activitystreams(TestCase):
|
||||||
|
"""using redis to build activity streams"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
"""use a test csv"""
|
||||||
|
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", "mouse@mouse.mouse", "password", local=True, localname="mouse"
|
||||||
|
)
|
||||||
|
self.another_user = models.User.objects.create_user(
|
||||||
|
"nutria",
|
||||||
|
"nutria@nutria.nutria",
|
||||||
|
"password",
|
||||||
|
local=True,
|
||||||
|
localname="nutria",
|
||||||
|
)
|
||||||
|
with patch("bookwyrm.models.user.set_remote_server.delay"):
|
||||||
|
self.remote_user = models.User.objects.create_user(
|
||||||
|
"rat",
|
||||||
|
"rat@rat.com",
|
||||||
|
"ratword",
|
||||||
|
local=False,
|
||||||
|
remote_id="https://example.com/users/rat",
|
||||||
|
inbox="https://example.com/users/rat/inbox",
|
||||||
|
outbox="https://example.com/users/rat/outbox",
|
||||||
|
)
|
||||||
|
work = models.Work.objects.create(title="test work")
|
||||||
|
self.book = models.Edition.objects.create(title="test book", parent_work=work)
|
||||||
|
|
||||||
|
def test_localstream_get_audience_remote_status(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
status = models.Status.objects.create(
|
||||||
|
user=self.remote_user, content="hi", privacy="public"
|
||||||
|
)
|
||||||
|
users = activitystreams.LocalStream().get_audience(status)
|
||||||
|
self.assertEqual(users, [])
|
||||||
|
|
||||||
|
def test_localstream_get_audience_local_status(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
status = models.Status.objects.create(
|
||||||
|
user=self.local_user, content="hi", privacy="public"
|
||||||
|
)
|
||||||
|
users = activitystreams.LocalStream().get_audience(status)
|
||||||
|
self.assertTrue(self.local_user in users)
|
||||||
|
self.assertTrue(self.another_user in users)
|
||||||
|
|
||||||
|
def test_localstream_get_audience_unlisted(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
status = models.Status.objects.create(
|
||||||
|
user=self.local_user, content="hi", privacy="unlisted"
|
||||||
|
)
|
||||||
|
users = activitystreams.LocalStream().get_audience(status)
|
||||||
|
self.assertEqual(users, [])
|
||||||
|
|
||||||
|
def test_localstream_get_audience_books_no_book(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
status = models.Status.objects.create(
|
||||||
|
user=self.local_user, content="hi", privacy="public"
|
||||||
|
)
|
||||||
|
audience = activitystreams.BooksStream().get_audience(status)
|
||||||
|
# no books, no audience
|
||||||
|
self.assertEqual(audience, [])
|
||||||
|
|
||||||
|
def test_localstream_get_audience_books_mention_books(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
status = models.Status.objects.create(
|
||||||
|
user=self.local_user, content="hi", privacy="public"
|
||||||
|
)
|
||||||
|
status.mention_books.add(self.book)
|
||||||
|
status.save(broadcast=False)
|
||||||
|
models.ShelfBook.objects.create(
|
||||||
|
user=self.local_user,
|
||||||
|
shelf=self.local_user.shelf_set.first(),
|
||||||
|
book=self.book,
|
||||||
|
)
|
||||||
|
# yes book, yes audience
|
||||||
|
audience = activitystreams.BooksStream().get_audience(status)
|
||||||
|
self.assertTrue(self.local_user in audience)
|
||||||
|
|
||||||
|
def test_localstream_get_audience_books_book_field(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
status = models.Comment.objects.create(
|
||||||
|
user=self.local_user, content="hi", privacy="public", book=self.book
|
||||||
|
)
|
||||||
|
models.ShelfBook.objects.create(
|
||||||
|
user=self.local_user,
|
||||||
|
shelf=self.local_user.shelf_set.first(),
|
||||||
|
book=self.book,
|
||||||
|
)
|
||||||
|
# yes book, yes audience
|
||||||
|
audience = activitystreams.BooksStream().get_audience(status)
|
||||||
|
self.assertTrue(self.local_user in audience)
|
||||||
|
|
||||||
|
def test_localstream_get_audience_books_alternate_edition(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
alt_book = models.Edition.objects.create(
|
||||||
|
title="hi", parent_work=self.book.parent_work
|
||||||
|
)
|
||||||
|
status = models.Comment.objects.create(
|
||||||
|
user=self.remote_user, content="hi", privacy="public", book=alt_book
|
||||||
|
)
|
||||||
|
models.ShelfBook.objects.create(
|
||||||
|
user=self.local_user,
|
||||||
|
shelf=self.local_user.shelf_set.first(),
|
||||||
|
book=self.book,
|
||||||
|
)
|
||||||
|
# yes book, yes audience
|
||||||
|
audience = activitystreams.BooksStream().get_audience(status)
|
||||||
|
self.assertTrue(self.local_user in audience)
|
||||||
|
|
||||||
|
def test_localstream_get_audience_books_non_public(self, *_):
|
||||||
|
"""get a list of users that should see a status"""
|
||||||
|
alt_book = models.Edition.objects.create(
|
||||||
|
title="hi", parent_work=self.book.parent_work
|
||||||
|
)
|
||||||
|
status = models.Comment.objects.create(
|
||||||
|
user=self.remote_user, content="hi", privacy="unlisted", book=alt_book
|
||||||
|
)
|
||||||
|
models.ShelfBook.objects.create(
|
||||||
|
user=self.local_user,
|
||||||
|
shelf=self.local_user.shelf_set.first(),
|
||||||
|
book=self.book,
|
||||||
|
)
|
||||||
|
# yes book, yes audience
|
||||||
|
audience = activitystreams.BooksStream().get_audience(status)
|
||||||
|
self.assertEqual(audience, [])
|
68
bookwyrm/tests/activitystreams/test_signals.py
Normal file
68
bookwyrm/tests/activitystreams/test_signals.py
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
""" testing activitystreams """
|
||||||
|
from unittest.mock import patch
|
||||||
|
from django.test import TestCase
|
||||||
|
from bookwyrm import activitystreams, models
|
||||||
|
|
||||||
|
|
||||||
|
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
|
||||||
|
class ActivitystreamsSignals(TestCase):
|
||||||
|
"""using redis to build activity streams"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
"""use a test csv"""
|
||||||
|
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", "mouse@mouse.mouse", "password", local=True, localname="mouse"
|
||||||
|
)
|
||||||
|
with patch("bookwyrm.models.user.set_remote_server.delay"):
|
||||||
|
self.remote_user = models.User.objects.create_user(
|
||||||
|
"rat",
|
||||||
|
"rat@rat.com",
|
||||||
|
"ratword",
|
||||||
|
local=False,
|
||||||
|
remote_id="https://example.com/users/rat",
|
||||||
|
inbox="https://example.com/users/rat/inbox",
|
||||||
|
outbox="https://example.com/users/rat/outbox",
|
||||||
|
)
|
||||||
|
work = models.Work.objects.create(title="test work")
|
||||||
|
self.book = models.Edition.objects.create(title="test book", parent_work=work)
|
||||||
|
|
||||||
|
def test_add_status_on_create_ignore(self, _):
|
||||||
|
"""a new statuses has entered"""
|
||||||
|
activitystreams.add_status_on_create(models.User, self.local_user, False)
|
||||||
|
|
||||||
|
def test_add_status_on_create_deleted(self, _):
|
||||||
|
"""a new statuses has entered"""
|
||||||
|
with patch("bookwyrm.activitystreams.remove_status_task.delay"):
|
||||||
|
status = models.Status.objects.create(
|
||||||
|
user=self.remote_user, content="hi", privacy="public", deleted=True
|
||||||
|
)
|
||||||
|
with patch("bookwyrm.activitystreams.remove_status_task.delay") as mock:
|
||||||
|
activitystreams.add_status_on_create(models.Status, status, False)
|
||||||
|
self.assertEqual(mock.call_count, 1)
|
||||||
|
args = mock.call_args[0]
|
||||||
|
self.assertEqual(args[0], status.id)
|
||||||
|
|
||||||
|
def test_add_status_on_create_created(self, _):
|
||||||
|
"""a new statuses has entered"""
|
||||||
|
status = models.Status.objects.create(
|
||||||
|
user=self.remote_user, content="hi", privacy="public"
|
||||||
|
)
|
||||||
|
with patch("bookwyrm.activitystreams.add_status_task.delay") as mock:
|
||||||
|
activitystreams.add_status_on_create_command(models.Status, status, False)
|
||||||
|
self.assertEqual(mock.call_count, 1)
|
||||||
|
args = mock.call_args[0]
|
||||||
|
self.assertEqual(args[0], status.id)
|
||||||
|
|
||||||
|
def test_populate_streams_on_account_create(self, _):
|
||||||
|
"""create streams for a user"""
|
||||||
|
with patch("bookwyrm.activitystreams.populate_stream_task.delay") as mock:
|
||||||
|
activitystreams.populate_streams_on_account_create(
|
||||||
|
models.User, self.local_user, True
|
||||||
|
)
|
||||||
|
self.assertEqual(mock.call_count, 3)
|
||||||
|
args = mock.call_args[0]
|
||||||
|
self.assertEqual(args[0], "books")
|
||||||
|
self.assertEqual(args[1], self.local_user.id)
|
193
bookwyrm/tests/activitystreams/test_tasks.py
Normal file
193
bookwyrm/tests/activitystreams/test_tasks.py
Normal file
|
@ -0,0 +1,193 @@
|
||||||
|
""" testing activitystreams """
|
||||||
|
from unittest.mock import patch
|
||||||
|
from django.test import TestCase
|
||||||
|
from bookwyrm import activitystreams, models
|
||||||
|
|
||||||
|
|
||||||
|
class Activitystreams(TestCase):
|
||||||
|
"""using redis to build activity streams"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
"""use a test csv"""
|
||||||
|
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", "mouse@mouse.mouse", "password", local=True, localname="mouse"
|
||||||
|
)
|
||||||
|
self.another_user = models.User.objects.create_user(
|
||||||
|
"nutria",
|
||||||
|
"nutria@nutria.nutria",
|
||||||
|
"password",
|
||||||
|
local=True,
|
||||||
|
localname="nutria",
|
||||||
|
)
|
||||||
|
work = models.Work.objects.create(title="test work")
|
||||||
|
self.book = models.Edition.objects.create(title="test book", parent_work=work)
|
||||||
|
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
|
||||||
|
self.status = models.Status.objects.create(
|
||||||
|
content="hi", user=self.local_user
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_add_book_statuses_task(self):
|
||||||
|
"""statuses related to a book"""
|
||||||
|
with patch("bookwyrm.activitystreams.BooksStream.add_book_statuses") as mock:
|
||||||
|
activitystreams.add_book_statuses_task(self.local_user.id, self.book.id)
|
||||||
|
self.assertTrue(mock.called)
|
||||||
|
args = mock.call_args[0]
|
||||||
|
self.assertEqual(args[0], self.local_user)
|
||||||
|
self.assertEqual(args[1], self.book)
|
||||||
|
|
||||||
|
def test_remove_book_statuses_task(self):
|
||||||
|
"""remove stauses related to a book"""
|
||||||
|
with patch("bookwyrm.activitystreams.BooksStream.remove_book_statuses") as mock:
|
||||||
|
activitystreams.remove_book_statuses_task(self.local_user.id, self.book.id)
|
||||||
|
self.assertTrue(mock.called)
|
||||||
|
args = mock.call_args[0]
|
||||||
|
self.assertEqual(args[0], self.local_user)
|
||||||
|
self.assertEqual(args[1], self.book)
|
||||||
|
|
||||||
|
def test_populate_stream_task(self):
|
||||||
|
"""populate a given stream"""
|
||||||
|
with patch("bookwyrm.activitystreams.BooksStream.populate_streams") as mock:
|
||||||
|
activitystreams.populate_stream_task("books", self.local_user.id)
|
||||||
|
self.assertTrue(mock.called)
|
||||||
|
args = mock.call_args[0]
|
||||||
|
self.assertEqual(args[0], self.local_user)
|
||||||
|
|
||||||
|
with patch("bookwyrm.activitystreams.HomeStream.populate_streams") as mock:
|
||||||
|
activitystreams.populate_stream_task("home", self.local_user.id)
|
||||||
|
self.assertTrue(mock.called)
|
||||||
|
args = mock.call_args[0]
|
||||||
|
self.assertEqual(args[0], self.local_user)
|
||||||
|
|
||||||
|
def test_remove_status_task(self):
|
||||||
|
"""remove a status from all streams"""
|
||||||
|
with patch(
|
||||||
|
"bookwyrm.activitystreams.ActivityStream.remove_object_from_related_stores"
|
||||||
|
) as mock:
|
||||||
|
activitystreams.remove_status_task(self.status.id)
|
||||||
|
self.assertEqual(mock.call_count, 3)
|
||||||
|
args = mock.call_args[0]
|
||||||
|
self.assertEqual(args[0], self.status)
|
||||||
|
|
||||||
|
def test_add_status_task(self):
|
||||||
|
"""add a status to all streams"""
|
||||||
|
with patch("bookwyrm.activitystreams.ActivityStream.add_status") as mock:
|
||||||
|
activitystreams.add_status_task(self.status.id)
|
||||||
|
self.assertEqual(mock.call_count, 3)
|
||||||
|
args = mock.call_args[0]
|
||||||
|
self.assertEqual(args[0], self.status)
|
||||||
|
|
||||||
|
def test_remove_user_statuses_task(self):
|
||||||
|
"""remove all statuses by a user from another users' feeds"""
|
||||||
|
with patch(
|
||||||
|
"bookwyrm.activitystreams.ActivityStream.remove_user_statuses"
|
||||||
|
) as mock:
|
||||||
|
activitystreams.remove_user_statuses_task(
|
||||||
|
self.local_user.id, self.another_user.id
|
||||||
|
)
|
||||||
|
self.assertEqual(mock.call_count, 3)
|
||||||
|
args = mock.call_args[0]
|
||||||
|
self.assertEqual(args[0], self.local_user)
|
||||||
|
self.assertEqual(args[1], self.another_user)
|
||||||
|
|
||||||
|
with patch("bookwyrm.activitystreams.HomeStream.remove_user_statuses") as mock:
|
||||||
|
activitystreams.remove_user_statuses_task(
|
||||||
|
self.local_user.id, self.another_user.id, stream_list=["home"]
|
||||||
|
)
|
||||||
|
self.assertEqual(mock.call_count, 1)
|
||||||
|
args = mock.call_args[0]
|
||||||
|
self.assertEqual(args[0], self.local_user)
|
||||||
|
self.assertEqual(args[1], self.another_user)
|
||||||
|
|
||||||
|
def test_add_user_statuses_task(self):
|
||||||
|
"""add a user's statuses to another users feeds"""
|
||||||
|
with patch("bookwyrm.activitystreams.ActivityStream.add_user_statuses") as mock:
|
||||||
|
activitystreams.add_user_statuses_task(
|
||||||
|
self.local_user.id, self.another_user.id
|
||||||
|
)
|
||||||
|
self.assertEqual(mock.call_count, 3)
|
||||||
|
args = mock.call_args[0]
|
||||||
|
self.assertEqual(args[0], self.local_user)
|
||||||
|
self.assertEqual(args[1], self.another_user)
|
||||||
|
|
||||||
|
with patch("bookwyrm.activitystreams.HomeStream.add_user_statuses") as mock:
|
||||||
|
activitystreams.add_user_statuses_task(
|
||||||
|
self.local_user.id, self.another_user.id, stream_list=["home"]
|
||||||
|
)
|
||||||
|
self.assertEqual(mock.call_count, 1)
|
||||||
|
args = mock.call_args[0]
|
||||||
|
self.assertEqual(args[0], self.local_user)
|
||||||
|
self.assertEqual(args[1], self.another_user)
|
||||||
|
|
||||||
|
@patch("bookwyrm.activitystreams.LocalStream.remove_object_from_related_stores")
|
||||||
|
@patch("bookwyrm.activitystreams.BooksStream.remove_object_from_related_stores")
|
||||||
|
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
|
||||||
|
def test_boost_to_another_timeline(self, *_):
|
||||||
|
"""add a boost and deduplicate the boosted status on the timeline"""
|
||||||
|
status = models.Status.objects.create(user=self.local_user, content="hi")
|
||||||
|
with patch("bookwyrm.activitystreams.handle_boost_task.delay"):
|
||||||
|
boost = models.Boost.objects.create(
|
||||||
|
boosted_status=status,
|
||||||
|
user=self.another_user,
|
||||||
|
)
|
||||||
|
with patch(
|
||||||
|
"bookwyrm.activitystreams.HomeStream.remove_object_from_related_stores"
|
||||||
|
) as mock:
|
||||||
|
activitystreams.handle_boost_task(boost.id)
|
||||||
|
|
||||||
|
self.assertTrue(mock.called)
|
||||||
|
call_args = mock.call_args
|
||||||
|
self.assertEqual(call_args[0][0], status)
|
||||||
|
self.assertEqual(
|
||||||
|
call_args[1]["stores"], ["{:d}-home".format(self.another_user.id)]
|
||||||
|
)
|
||||||
|
|
||||||
|
@patch("bookwyrm.activitystreams.LocalStream.remove_object_from_related_stores")
|
||||||
|
@patch("bookwyrm.activitystreams.BooksStream.remove_object_from_related_stores")
|
||||||
|
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
|
||||||
|
def test_boost_to_following_timeline(self, *_):
|
||||||
|
"""add a boost and deduplicate the boosted status on the timeline"""
|
||||||
|
self.local_user.following.add(self.another_user)
|
||||||
|
status = models.Status.objects.create(user=self.local_user, content="hi")
|
||||||
|
with patch("bookwyrm.activitystreams.handle_boost_task.delay"):
|
||||||
|
boost = models.Boost.objects.create(
|
||||||
|
boosted_status=status,
|
||||||
|
user=self.another_user,
|
||||||
|
)
|
||||||
|
with patch(
|
||||||
|
"bookwyrm.activitystreams.HomeStream.remove_object_from_related_stores"
|
||||||
|
) as mock:
|
||||||
|
activitystreams.handle_boost_task(boost.id)
|
||||||
|
self.assertTrue(mock.called)
|
||||||
|
call_args = mock.call_args
|
||||||
|
self.assertEqual(call_args[0][0], status)
|
||||||
|
self.assertTrue(
|
||||||
|
"{:d}-home".format(self.another_user.id) in call_args[1]["stores"]
|
||||||
|
)
|
||||||
|
self.assertTrue(
|
||||||
|
"{:d}-home".format(self.local_user.id) in call_args[1]["stores"]
|
||||||
|
)
|
||||||
|
|
||||||
|
@patch("bookwyrm.activitystreams.LocalStream.remove_object_from_related_stores")
|
||||||
|
@patch("bookwyrm.activitystreams.BooksStream.remove_object_from_related_stores")
|
||||||
|
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
|
||||||
|
def test_boost_to_same_timeline(self, *_):
|
||||||
|
"""add a boost and deduplicate the boosted status on the timeline"""
|
||||||
|
status = models.Status.objects.create(user=self.local_user, content="hi")
|
||||||
|
with patch("bookwyrm.activitystreams.handle_boost_task.delay"):
|
||||||
|
boost = models.Boost.objects.create(
|
||||||
|
boosted_status=status,
|
||||||
|
user=self.local_user,
|
||||||
|
)
|
||||||
|
with patch(
|
||||||
|
"bookwyrm.activitystreams.HomeStream.remove_object_from_related_stores"
|
||||||
|
) as mock:
|
||||||
|
activitystreams.handle_boost_task(boost.id)
|
||||||
|
self.assertTrue(mock.called)
|
||||||
|
call_args = mock.call_args
|
||||||
|
self.assertEqual(call_args[0][0], status)
|
||||||
|
self.assertEqual(
|
||||||
|
call_args[1]["stores"], ["{:d}-home".format(self.local_user.id)]
|
||||||
|
)
|
|
@ -1,360 +0,0 @@
|
||||||
""" testing activitystreams """
|
|
||||||
from unittest.mock import patch
|
|
||||||
from django.test import TestCase
|
|
||||||
from bookwyrm import activitystreams, models
|
|
||||||
|
|
||||||
|
|
||||||
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
|
|
||||||
@patch("bookwyrm.activitystreams.add_status_task.delay")
|
|
||||||
@patch("bookwyrm.activitystreams.add_book_statuses_task.delay")
|
|
||||||
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
|
|
||||||
@patch("bookwyrm.activitystreams.populate_stream_task.delay")
|
|
||||||
# pylint: disable=too-many-public-methods
|
|
||||||
class Activitystreams(TestCase):
|
|
||||||
"""using redis to build activity streams"""
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
"""use a test csv"""
|
|
||||||
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", "mouse@mouse.mouse", "password", local=True, localname="mouse"
|
|
||||||
)
|
|
||||||
self.another_user = models.User.objects.create_user(
|
|
||||||
"nutria",
|
|
||||||
"nutria@nutria.nutria",
|
|
||||||
"password",
|
|
||||||
local=True,
|
|
||||||
localname="nutria",
|
|
||||||
)
|
|
||||||
with patch("bookwyrm.models.user.set_remote_server.delay"):
|
|
||||||
self.remote_user = models.User.objects.create_user(
|
|
||||||
"rat",
|
|
||||||
"rat@rat.com",
|
|
||||||
"ratword",
|
|
||||||
local=False,
|
|
||||||
remote_id="https://example.com/users/rat",
|
|
||||||
inbox="https://example.com/users/rat/inbox",
|
|
||||||
outbox="https://example.com/users/rat/outbox",
|
|
||||||
)
|
|
||||||
work = models.Work.objects.create(title="test work")
|
|
||||||
self.book = models.Edition.objects.create(title="test book", parent_work=work)
|
|
||||||
|
|
||||||
class TestStream(activitystreams.ActivityStream):
|
|
||||||
"""test stream, don't have to do anything here"""
|
|
||||||
|
|
||||||
key = "test"
|
|
||||||
|
|
||||||
self.test_stream = TestStream()
|
|
||||||
|
|
||||||
def test_activitystream_class_ids(self, *_):
|
|
||||||
"""the abstract base class for stream objects"""
|
|
||||||
self.assertEqual(
|
|
||||||
self.test_stream.stream_id(self.local_user),
|
|
||||||
"{}-test".format(self.local_user.id),
|
|
||||||
)
|
|
||||||
self.assertEqual(
|
|
||||||
self.test_stream.unread_id(self.local_user),
|
|
||||||
"{}-test-unread".format(self.local_user.id),
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_abstractstream_get_audience(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
status = models.Status.objects.create(
|
|
||||||
user=self.remote_user, content="hi", privacy="public"
|
|
||||||
)
|
|
||||||
users = self.test_stream.get_audience(status)
|
|
||||||
# remote users don't have feeds
|
|
||||||
self.assertFalse(self.remote_user in users)
|
|
||||||
self.assertTrue(self.local_user in users)
|
|
||||||
self.assertTrue(self.another_user in users)
|
|
||||||
|
|
||||||
def test_abstractstream_get_audience_direct(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
status = models.Status.objects.create(
|
|
||||||
user=self.remote_user,
|
|
||||||
content="hi",
|
|
||||||
privacy="direct",
|
|
||||||
)
|
|
||||||
status.mention_users.add(self.local_user)
|
|
||||||
users = self.test_stream.get_audience(status)
|
|
||||||
self.assertEqual(users, [])
|
|
||||||
|
|
||||||
status = models.Comment.objects.create(
|
|
||||||
user=self.remote_user,
|
|
||||||
content="hi",
|
|
||||||
privacy="direct",
|
|
||||||
book=self.book,
|
|
||||||
)
|
|
||||||
status.mention_users.add(self.local_user)
|
|
||||||
users = self.test_stream.get_audience(status)
|
|
||||||
self.assertTrue(self.local_user in users)
|
|
||||||
self.assertFalse(self.another_user in users)
|
|
||||||
self.assertFalse(self.remote_user in users)
|
|
||||||
|
|
||||||
def test_abstractstream_get_audience_followers_remote_user(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
status = models.Status.objects.create(
|
|
||||||
user=self.remote_user,
|
|
||||||
content="hi",
|
|
||||||
privacy="followers",
|
|
||||||
)
|
|
||||||
users = self.test_stream.get_audience(status)
|
|
||||||
self.assertFalse(users.exists())
|
|
||||||
|
|
||||||
def test_abstractstream_get_audience_followers_self(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
status = models.Comment.objects.create(
|
|
||||||
user=self.local_user,
|
|
||||||
content="hi",
|
|
||||||
privacy="direct",
|
|
||||||
book=self.book,
|
|
||||||
)
|
|
||||||
users = self.test_stream.get_audience(status)
|
|
||||||
self.assertTrue(self.local_user in users)
|
|
||||||
self.assertFalse(self.another_user in users)
|
|
||||||
self.assertFalse(self.remote_user in users)
|
|
||||||
|
|
||||||
def test_abstractstream_get_audience_followers_with_mention(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
status = models.Comment.objects.create(
|
|
||||||
user=self.remote_user,
|
|
||||||
content="hi",
|
|
||||||
privacy="direct",
|
|
||||||
book=self.book,
|
|
||||||
)
|
|
||||||
status.mention_users.add(self.local_user)
|
|
||||||
|
|
||||||
users = self.test_stream.get_audience(status)
|
|
||||||
self.assertTrue(self.local_user in users)
|
|
||||||
self.assertFalse(self.another_user in users)
|
|
||||||
self.assertFalse(self.remote_user in users)
|
|
||||||
|
|
||||||
def test_abstractstream_get_audience_followers_with_relationship(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
self.remote_user.followers.add(self.local_user)
|
|
||||||
status = models.Comment.objects.create(
|
|
||||||
user=self.remote_user,
|
|
||||||
content="hi",
|
|
||||||
privacy="direct",
|
|
||||||
book=self.book,
|
|
||||||
)
|
|
||||||
users = self.test_stream.get_audience(status)
|
|
||||||
self.assertFalse(self.local_user in users)
|
|
||||||
self.assertFalse(self.another_user in users)
|
|
||||||
self.assertFalse(self.remote_user in users)
|
|
||||||
|
|
||||||
def test_homestream_get_audience(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
status = models.Status.objects.create(
|
|
||||||
user=self.remote_user, content="hi", privacy="public"
|
|
||||||
)
|
|
||||||
users = activitystreams.HomeStream().get_audience(status)
|
|
||||||
self.assertFalse(users.exists())
|
|
||||||
|
|
||||||
def test_homestream_get_audience_with_mentions(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
status = models.Status.objects.create(
|
|
||||||
user=self.remote_user, content="hi", privacy="public"
|
|
||||||
)
|
|
||||||
status.mention_users.add(self.local_user)
|
|
||||||
users = activitystreams.HomeStream().get_audience(status)
|
|
||||||
self.assertFalse(self.local_user in users)
|
|
||||||
self.assertFalse(self.another_user in users)
|
|
||||||
|
|
||||||
def test_homestream_get_audience_with_relationship(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
self.remote_user.followers.add(self.local_user)
|
|
||||||
status = models.Status.objects.create(
|
|
||||||
user=self.remote_user, content="hi", privacy="public"
|
|
||||||
)
|
|
||||||
users = activitystreams.HomeStream().get_audience(status)
|
|
||||||
self.assertTrue(self.local_user in users)
|
|
||||||
self.assertFalse(self.another_user in users)
|
|
||||||
|
|
||||||
def test_localstream_get_audience_remote_status(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
status = models.Status.objects.create(
|
|
||||||
user=self.remote_user, content="hi", privacy="public"
|
|
||||||
)
|
|
||||||
users = activitystreams.LocalStream().get_audience(status)
|
|
||||||
self.assertEqual(users, [])
|
|
||||||
|
|
||||||
def test_localstream_get_audience_local_status(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
status = models.Status.objects.create(
|
|
||||||
user=self.local_user, content="hi", privacy="public"
|
|
||||||
)
|
|
||||||
users = activitystreams.LocalStream().get_audience(status)
|
|
||||||
self.assertTrue(self.local_user in users)
|
|
||||||
self.assertTrue(self.another_user in users)
|
|
||||||
|
|
||||||
def test_localstream_get_audience_unlisted(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
status = models.Status.objects.create(
|
|
||||||
user=self.local_user, content="hi", privacy="unlisted"
|
|
||||||
)
|
|
||||||
users = activitystreams.LocalStream().get_audience(status)
|
|
||||||
self.assertEqual(users, [])
|
|
||||||
|
|
||||||
def test_localstream_get_audience_books_no_book(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
status = models.Status.objects.create(
|
|
||||||
user=self.local_user, content="hi", privacy="public"
|
|
||||||
)
|
|
||||||
audience = activitystreams.BooksStream().get_audience(status)
|
|
||||||
# no books, no audience
|
|
||||||
self.assertEqual(audience, [])
|
|
||||||
|
|
||||||
def test_localstream_get_audience_books_mention_books(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
status = models.Status.objects.create(
|
|
||||||
user=self.local_user, content="hi", privacy="public"
|
|
||||||
)
|
|
||||||
status.mention_books.add(self.book)
|
|
||||||
status.save(broadcast=False)
|
|
||||||
models.ShelfBook.objects.create(
|
|
||||||
user=self.local_user,
|
|
||||||
shelf=self.local_user.shelf_set.first(),
|
|
||||||
book=self.book,
|
|
||||||
)
|
|
||||||
# yes book, yes audience
|
|
||||||
audience = activitystreams.BooksStream().get_audience(status)
|
|
||||||
self.assertTrue(self.local_user in audience)
|
|
||||||
|
|
||||||
def test_localstream_get_audience_books_book_field(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
status = models.Comment.objects.create(
|
|
||||||
user=self.local_user, content="hi", privacy="public", book=self.book
|
|
||||||
)
|
|
||||||
models.ShelfBook.objects.create(
|
|
||||||
user=self.local_user,
|
|
||||||
shelf=self.local_user.shelf_set.first(),
|
|
||||||
book=self.book,
|
|
||||||
)
|
|
||||||
# yes book, yes audience
|
|
||||||
audience = activitystreams.BooksStream().get_audience(status)
|
|
||||||
self.assertTrue(self.local_user in audience)
|
|
||||||
|
|
||||||
def test_localstream_get_audience_books_alternate_edition(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
alt_book = models.Edition.objects.create(
|
|
||||||
title="hi", parent_work=self.book.parent_work
|
|
||||||
)
|
|
||||||
status = models.Comment.objects.create(
|
|
||||||
user=self.remote_user, content="hi", privacy="public", book=alt_book
|
|
||||||
)
|
|
||||||
models.ShelfBook.objects.create(
|
|
||||||
user=self.local_user,
|
|
||||||
shelf=self.local_user.shelf_set.first(),
|
|
||||||
book=self.book,
|
|
||||||
)
|
|
||||||
# yes book, yes audience
|
|
||||||
audience = activitystreams.BooksStream().get_audience(status)
|
|
||||||
self.assertTrue(self.local_user in audience)
|
|
||||||
|
|
||||||
def test_localstream_get_audience_books_non_public(self, *_):
|
|
||||||
"""get a list of users that should see a status"""
|
|
||||||
alt_book = models.Edition.objects.create(
|
|
||||||
title="hi", parent_work=self.book.parent_work
|
|
||||||
)
|
|
||||||
status = models.Comment.objects.create(
|
|
||||||
user=self.remote_user, content="hi", privacy="unlisted", book=alt_book
|
|
||||||
)
|
|
||||||
models.ShelfBook.objects.create(
|
|
||||||
user=self.local_user,
|
|
||||||
shelf=self.local_user.shelf_set.first(),
|
|
||||||
book=self.book,
|
|
||||||
)
|
|
||||||
# yes book, yes audience
|
|
||||||
audience = activitystreams.BooksStream().get_audience(status)
|
|
||||||
self.assertEqual(audience, [])
|
|
||||||
|
|
||||||
def test_get_statuses_for_user_books(self, *_):
|
|
||||||
"""create a stream for a user"""
|
|
||||||
alt_book = models.Edition.objects.create(
|
|
||||||
title="hi", parent_work=self.book.parent_work
|
|
||||||
)
|
|
||||||
status = models.Status.objects.create(
|
|
||||||
user=self.local_user, content="hi", privacy="public"
|
|
||||||
)
|
|
||||||
status = models.Comment.objects.create(
|
|
||||||
user=self.remote_user, content="hi", privacy="public", book=alt_book
|
|
||||||
)
|
|
||||||
models.ShelfBook.objects.create(
|
|
||||||
user=self.local_user,
|
|
||||||
shelf=self.local_user.shelf_set.first(),
|
|
||||||
book=self.book,
|
|
||||||
)
|
|
||||||
# yes book, yes audience
|
|
||||||
result = activitystreams.BooksStream().get_statuses_for_user(self.local_user)
|
|
||||||
self.assertEqual(list(result), [status])
|
|
||||||
|
|
||||||
@patch("bookwyrm.activitystreams.LocalStream.remove_object_from_related_stores")
|
|
||||||
@patch("bookwyrm.activitystreams.BooksStream.remove_object_from_related_stores")
|
|
||||||
def test_boost_to_another_timeline(self, *_):
|
|
||||||
"""add a boost and deduplicate the boosted status on the timeline"""
|
|
||||||
status = models.Status.objects.create(user=self.local_user, content="hi")
|
|
||||||
with patch("bookwyrm.activitystreams.handle_boost_task.delay"):
|
|
||||||
boost = models.Boost.objects.create(
|
|
||||||
boosted_status=status,
|
|
||||||
user=self.another_user,
|
|
||||||
)
|
|
||||||
with patch(
|
|
||||||
"bookwyrm.activitystreams.HomeStream.remove_object_from_related_stores"
|
|
||||||
) as mock:
|
|
||||||
activitystreams.handle_boost_task(boost.id)
|
|
||||||
|
|
||||||
self.assertTrue(mock.called)
|
|
||||||
call_args = mock.call_args
|
|
||||||
self.assertEqual(call_args[0][0], status)
|
|
||||||
self.assertEqual(
|
|
||||||
call_args[1]["stores"], ["{:d}-home".format(self.another_user.id)]
|
|
||||||
)
|
|
||||||
|
|
||||||
@patch("bookwyrm.activitystreams.LocalStream.remove_object_from_related_stores")
|
|
||||||
@patch("bookwyrm.activitystreams.BooksStream.remove_object_from_related_stores")
|
|
||||||
def test_boost_to_following_timeline(self, *_):
|
|
||||||
"""add a boost and deduplicate the boosted status on the timeline"""
|
|
||||||
self.local_user.following.add(self.another_user)
|
|
||||||
status = models.Status.objects.create(user=self.local_user, content="hi")
|
|
||||||
with patch("bookwyrm.activitystreams.handle_boost_task.delay"):
|
|
||||||
boost = models.Boost.objects.create(
|
|
||||||
boosted_status=status,
|
|
||||||
user=self.another_user,
|
|
||||||
)
|
|
||||||
with patch(
|
|
||||||
"bookwyrm.activitystreams.HomeStream.remove_object_from_related_stores"
|
|
||||||
) as mock:
|
|
||||||
activitystreams.handle_boost_task(boost.id)
|
|
||||||
self.assertTrue(mock.called)
|
|
||||||
call_args = mock.call_args
|
|
||||||
self.assertEqual(call_args[0][0], status)
|
|
||||||
self.assertTrue(
|
|
||||||
"{:d}-home".format(self.another_user.id) in call_args[1]["stores"]
|
|
||||||
)
|
|
||||||
self.assertTrue(
|
|
||||||
"{:d}-home".format(self.local_user.id) in call_args[1]["stores"]
|
|
||||||
)
|
|
||||||
|
|
||||||
@patch("bookwyrm.activitystreams.LocalStream.remove_object_from_related_stores")
|
|
||||||
@patch("bookwyrm.activitystreams.BooksStream.remove_object_from_related_stores")
|
|
||||||
def test_boost_to_same_timeline(self, *_):
|
|
||||||
"""add a boost and deduplicate the boosted status on the timeline"""
|
|
||||||
status = models.Status.objects.create(user=self.local_user, content="hi")
|
|
||||||
with patch("bookwyrm.activitystreams.handle_boost_task.delay"):
|
|
||||||
boost = models.Boost.objects.create(
|
|
||||||
boosted_status=status,
|
|
||||||
user=self.local_user,
|
|
||||||
)
|
|
||||||
with patch(
|
|
||||||
"bookwyrm.activitystreams.HomeStream.remove_object_from_related_stores"
|
|
||||||
) as mock:
|
|
||||||
activitystreams.handle_boost_task(boost.id)
|
|
||||||
self.assertTrue(mock.called)
|
|
||||||
call_args = mock.call_args
|
|
||||||
self.assertEqual(call_args[0][0], status)
|
|
||||||
self.assertEqual(
|
|
||||||
call_args[1]["stores"], ["{:d}-home".format(self.local_user.id)]
|
|
||||||
)
|
|
110
bookwyrm/tests/views/test_login.py
Normal file
110
bookwyrm/tests/views/test_login.py
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
""" test for app action functionality """
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
from django.contrib.auth.models import AnonymousUser
|
||||||
|
from django.template.response import TemplateResponse
|
||||||
|
from django.test import TestCase
|
||||||
|
from django.test.client import RequestFactory
|
||||||
|
|
||||||
|
from bookwyrm import forms, models, views
|
||||||
|
|
||||||
|
|
||||||
|
# pylint: disable=too-many-public-methods
|
||||||
|
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
|
||||||
|
@patch("bookwyrm.activitystreams.populate_stream_task.delay")
|
||||||
|
class LoginViews(TestCase):
|
||||||
|
"""login and password management"""
|
||||||
|
|
||||||
|
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@your.domain.here",
|
||||||
|
"mouse@mouse.com",
|
||||||
|
"password",
|
||||||
|
local=True,
|
||||||
|
localname="mouse",
|
||||||
|
)
|
||||||
|
self.anonymous_user = AnonymousUser
|
||||||
|
self.anonymous_user.is_authenticated = False
|
||||||
|
|
||||||
|
models.SiteSettings.objects.create(id=1, require_confirm_email=False)
|
||||||
|
|
||||||
|
def test_login_get(self, *_):
|
||||||
|
"""there are so many views, this just makes sure it LOADS"""
|
||||||
|
login = views.Login.as_view()
|
||||||
|
request = self.factory.get("")
|
||||||
|
request.user = self.anonymous_user
|
||||||
|
|
||||||
|
result = login(request)
|
||||||
|
self.assertIsInstance(result, TemplateResponse)
|
||||||
|
result.render()
|
||||||
|
self.assertEqual(result.status_code, 200)
|
||||||
|
|
||||||
|
request.user = self.local_user
|
||||||
|
result = login(request)
|
||||||
|
self.assertEqual(result.url, "/")
|
||||||
|
self.assertEqual(result.status_code, 302)
|
||||||
|
|
||||||
|
def test_login_post_localname(self, *_):
|
||||||
|
"""there are so many views, this just makes sure it LOADS"""
|
||||||
|
view = views.Login.as_view()
|
||||||
|
form = forms.LoginForm()
|
||||||
|
form.data["localname"] = "mouse@mouse.com"
|
||||||
|
form.data["password"] = "password"
|
||||||
|
request = self.factory.post("", form.data)
|
||||||
|
request.user = self.anonymous_user
|
||||||
|
|
||||||
|
with patch("bookwyrm.views.login.login"):
|
||||||
|
result = view(request)
|
||||||
|
self.assertEqual(result.url, "/")
|
||||||
|
self.assertEqual(result.status_code, 302)
|
||||||
|
|
||||||
|
def test_login_post_username(self, *_):
|
||||||
|
"""there are so many views, this just makes sure it LOADS"""
|
||||||
|
view = views.Login.as_view()
|
||||||
|
form = forms.LoginForm()
|
||||||
|
form.data["localname"] = "mouse@your.domain.here"
|
||||||
|
form.data["password"] = "password"
|
||||||
|
request = self.factory.post("", form.data)
|
||||||
|
request.user = self.anonymous_user
|
||||||
|
|
||||||
|
with patch("bookwyrm.views.login.login"):
|
||||||
|
result = view(request)
|
||||||
|
self.assertEqual(result.url, "/")
|
||||||
|
self.assertEqual(result.status_code, 302)
|
||||||
|
|
||||||
|
def test_login_post_email(self, *_):
|
||||||
|
"""there are so many views, this just makes sure it LOADS"""
|
||||||
|
view = views.Login.as_view()
|
||||||
|
form = forms.LoginForm()
|
||||||
|
form.data["localname"] = "mouse"
|
||||||
|
form.data["password"] = "password"
|
||||||
|
request = self.factory.post("", form.data)
|
||||||
|
request.user = self.anonymous_user
|
||||||
|
|
||||||
|
with patch("bookwyrm.views.login.login"):
|
||||||
|
result = view(request)
|
||||||
|
self.assertEqual(result.url, "/")
|
||||||
|
self.assertEqual(result.status_code, 302)
|
||||||
|
|
||||||
|
def test_login_post_invalid_credentials(self, *_):
|
||||||
|
"""there are so many views, this just makes sure it LOADS"""
|
||||||
|
view = views.Login.as_view()
|
||||||
|
form = forms.LoginForm()
|
||||||
|
form.data["localname"] = "mouse"
|
||||||
|
form.data["password"] = "passsword1"
|
||||||
|
request = self.factory.post("", form.data)
|
||||||
|
request.user = self.anonymous_user
|
||||||
|
|
||||||
|
with patch("bookwyrm.views.login.login"):
|
||||||
|
result = view(request)
|
||||||
|
result.render()
|
||||||
|
self.assertEqual(result.status_code, 200)
|
||||||
|
self.assertEqual(
|
||||||
|
result.context_data["login_form"].non_field_errors,
|
||||||
|
"Username or password are incorrect",
|
||||||
|
)
|
|
@ -8,14 +8,14 @@ from django.template.response import TemplateResponse
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import RequestFactory
|
from django.test.client import RequestFactory
|
||||||
|
|
||||||
from bookwyrm import forms, models, views
|
from bookwyrm import models, views
|
||||||
from bookwyrm.settings import DOMAIN
|
from bookwyrm.settings import DOMAIN
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=too-many-public-methods
|
# pylint: disable=too-many-public-methods
|
||||||
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
|
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
|
||||||
@patch("bookwyrm.activitystreams.populate_stream_task.delay")
|
@patch("bookwyrm.activitystreams.populate_stream_task.delay")
|
||||||
class AuthenticationViews(TestCase):
|
class RegisterViews(TestCase):
|
||||||
"""login and password management"""
|
"""login and password management"""
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -38,82 +38,6 @@ class AuthenticationViews(TestCase):
|
||||||
id=1, require_confirm_email=False
|
id=1, require_confirm_email=False
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_login_get(self, *_):
|
|
||||||
"""there are so many views, this just makes sure it LOADS"""
|
|
||||||
login = views.Login.as_view()
|
|
||||||
request = self.factory.get("")
|
|
||||||
request.user = self.anonymous_user
|
|
||||||
|
|
||||||
result = login(request)
|
|
||||||
self.assertIsInstance(result, TemplateResponse)
|
|
||||||
result.render()
|
|
||||||
self.assertEqual(result.status_code, 200)
|
|
||||||
|
|
||||||
request.user = self.local_user
|
|
||||||
result = login(request)
|
|
||||||
self.assertEqual(result.url, "/")
|
|
||||||
self.assertEqual(result.status_code, 302)
|
|
||||||
|
|
||||||
def test_login_post_localname(self, *_):
|
|
||||||
"""there are so many views, this just makes sure it LOADS"""
|
|
||||||
view = views.Login.as_view()
|
|
||||||
form = forms.LoginForm()
|
|
||||||
form.data["localname"] = "mouse@mouse.com"
|
|
||||||
form.data["password"] = "password"
|
|
||||||
request = self.factory.post("", form.data)
|
|
||||||
request.user = self.anonymous_user
|
|
||||||
|
|
||||||
with patch("bookwyrm.views.authentication.login"):
|
|
||||||
result = view(request)
|
|
||||||
self.assertEqual(result.url, "/")
|
|
||||||
self.assertEqual(result.status_code, 302)
|
|
||||||
|
|
||||||
def test_login_post_username(self, *_):
|
|
||||||
"""there are so many views, this just makes sure it LOADS"""
|
|
||||||
view = views.Login.as_view()
|
|
||||||
form = forms.LoginForm()
|
|
||||||
form.data["localname"] = "mouse@your.domain.here"
|
|
||||||
form.data["password"] = "password"
|
|
||||||
request = self.factory.post("", form.data)
|
|
||||||
request.user = self.anonymous_user
|
|
||||||
|
|
||||||
with patch("bookwyrm.views.authentication.login"):
|
|
||||||
result = view(request)
|
|
||||||
self.assertEqual(result.url, "/")
|
|
||||||
self.assertEqual(result.status_code, 302)
|
|
||||||
|
|
||||||
def test_login_post_email(self, *_):
|
|
||||||
"""there are so many views, this just makes sure it LOADS"""
|
|
||||||
view = views.Login.as_view()
|
|
||||||
form = forms.LoginForm()
|
|
||||||
form.data["localname"] = "mouse"
|
|
||||||
form.data["password"] = "password"
|
|
||||||
request = self.factory.post("", form.data)
|
|
||||||
request.user = self.anonymous_user
|
|
||||||
|
|
||||||
with patch("bookwyrm.views.authentication.login"):
|
|
||||||
result = view(request)
|
|
||||||
self.assertEqual(result.url, "/")
|
|
||||||
self.assertEqual(result.status_code, 302)
|
|
||||||
|
|
||||||
def test_login_post_invalid_credentials(self, *_):
|
|
||||||
"""there are so many views, this just makes sure it LOADS"""
|
|
||||||
view = views.Login.as_view()
|
|
||||||
form = forms.LoginForm()
|
|
||||||
form.data["localname"] = "mouse"
|
|
||||||
form.data["password"] = "passsword1"
|
|
||||||
request = self.factory.post("", form.data)
|
|
||||||
request.user = self.anonymous_user
|
|
||||||
|
|
||||||
with patch("bookwyrm.views.authentication.login"):
|
|
||||||
result = view(request)
|
|
||||||
result.render()
|
|
||||||
self.assertEqual(result.status_code, 200)
|
|
||||||
self.assertEqual(
|
|
||||||
result.context_data["login_form"].non_field_errors,
|
|
||||||
"Username or password are incorrect",
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_register(self, *_):
|
def test_register(self, *_):
|
||||||
"""create a user"""
|
"""create a user"""
|
||||||
view = views.Register.as_view()
|
view = views.Register.as_view()
|
||||||
|
@ -126,7 +50,7 @@ class AuthenticationViews(TestCase):
|
||||||
"email": "aa@bb.cccc",
|
"email": "aa@bb.cccc",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
with patch("bookwyrm.views.authentication.login"):
|
with patch("bookwyrm.views.register.login"):
|
||||||
response = view(request)
|
response = view(request)
|
||||||
self.assertEqual(models.User.objects.count(), 2)
|
self.assertEqual(models.User.objects.count(), 2)
|
||||||
self.assertEqual(response.status_code, 302)
|
self.assertEqual(response.status_code, 302)
|
||||||
|
@ -151,7 +75,7 @@ class AuthenticationViews(TestCase):
|
||||||
"email": "aa@bb.cccc",
|
"email": "aa@bb.cccc",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
with patch("bookwyrm.views.authentication.login"):
|
with patch("bookwyrm.views.register.login"):
|
||||||
response = view(request)
|
response = view(request)
|
||||||
self.assertEqual(response.status_code, 302)
|
self.assertEqual(response.status_code, 302)
|
||||||
nutria = models.User.objects.get(localname="nutria")
|
nutria = models.User.objects.get(localname="nutria")
|
||||||
|
@ -169,7 +93,7 @@ class AuthenticationViews(TestCase):
|
||||||
"register/",
|
"register/",
|
||||||
{"localname": "nutria ", "password": "mouseword", "email": "aa@bb.ccc"},
|
{"localname": "nutria ", "password": "mouseword", "email": "aa@bb.ccc"},
|
||||||
)
|
)
|
||||||
with patch("bookwyrm.views.authentication.login"):
|
with patch("bookwyrm.views.register.login"):
|
||||||
response = view(request)
|
response = view(request)
|
||||||
self.assertEqual(models.User.objects.count(), 2)
|
self.assertEqual(models.User.objects.count(), 2)
|
||||||
self.assertEqual(response.status_code, 302)
|
self.assertEqual(response.status_code, 302)
|
||||||
|
@ -248,7 +172,7 @@ class AuthenticationViews(TestCase):
|
||||||
"invite_code": "testcode",
|
"invite_code": "testcode",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
with patch("bookwyrm.views.authentication.login"):
|
with patch("bookwyrm.views.register.login"):
|
||||||
response = view(request)
|
response = view(request)
|
||||||
self.assertEqual(models.User.objects.count(), 2)
|
self.assertEqual(models.User.objects.count(), 2)
|
||||||
self.assertEqual(response.status_code, 302)
|
self.assertEqual(response.status_code, 302)
|
|
@ -1,7 +1,5 @@
|
||||||
""" make sure all our nice views are available """
|
""" make sure all our nice views are available """
|
||||||
from .announcements import Announcements, Announcement, delete_announcement
|
from .announcements import Announcements, Announcement, delete_announcement
|
||||||
from .authentication import Login, Register, Logout
|
|
||||||
from .authentication import ConfirmEmail, ConfirmEmailCode, resend_link
|
|
||||||
from .author import Author, EditAuthor
|
from .author import Author, EditAuthor
|
||||||
from .block import Block, unblock
|
from .block import Block, unblock
|
||||||
from .books import Book, EditBook, ConfirmEditBook
|
from .books import Book, EditBook, ConfirmEditBook
|
||||||
|
@ -28,11 +26,13 @@ from .landing import About, Home, Landing
|
||||||
from .list import Lists, SavedLists, List, Curate, UserLists
|
from .list import Lists, SavedLists, List, Curate, UserLists
|
||||||
from .list import save_list, unsave_list
|
from .list import save_list, unsave_list
|
||||||
from .list import delete_list
|
from .list import delete_list
|
||||||
|
from .login import Login, Logout
|
||||||
from .notifications import Notifications
|
from .notifications import Notifications
|
||||||
from .outbox import Outbox
|
from .outbox import Outbox
|
||||||
from .reading import edit_readthrough, create_readthrough
|
from .reading import edit_readthrough, create_readthrough
|
||||||
from .reading import delete_readthrough, delete_progressupdate
|
from .reading import delete_readthrough, delete_progressupdate
|
||||||
from .reading import ReadingStatus
|
from .reading import ReadingStatus
|
||||||
|
from .register import Register, ConfirmEmail, ConfirmEmailCode, resend_link
|
||||||
from .reports import Report, Reports, make_report, resolve_report, suspend_user
|
from .reports import Report, Reports, make_report, resolve_report, suspend_user
|
||||||
from .rss_feed import RssFeed
|
from .rss_feed import RssFeed
|
||||||
from .password import PasswordResetRequest, PasswordReset, ChangePassword
|
from .password import PasswordResetRequest, PasswordReset, ChangePassword
|
||||||
|
|
|
@ -28,7 +28,7 @@ class Import(View):
|
||||||
"""load import page"""
|
"""load import page"""
|
||||||
return TemplateResponse(
|
return TemplateResponse(
|
||||||
request,
|
request,
|
||||||
"import.html",
|
"import/import.html",
|
||||||
{
|
{
|
||||||
"import_form": forms.ImportForm(),
|
"import_form": forms.ImportForm(),
|
||||||
"jobs": models.ImportJob.objects.filter(user=request.user).order_by(
|
"jobs": models.ImportJob.objects.filter(user=request.user).order_by(
|
||||||
|
@ -94,7 +94,7 @@ class ImportStatus(View):
|
||||||
items = [i for i in items if not i.fail_reason]
|
items = [i for i in items if not i.fail_reason]
|
||||||
return TemplateResponse(
|
return TemplateResponse(
|
||||||
request,
|
request,
|
||||||
"import_status.html",
|
"import/import_status.html",
|
||||||
{"job": job, "items": items, "failed_items": failed_items, "task": task},
|
{"job": job, "items": items, "failed_items": failed_items, "task": task},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,7 @@ def is_blocked_activity(activity_json):
|
||||||
return models.FederatedServer.is_blocked(actor)
|
return models.FederatedServer.is_blocked(actor)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task(queue="medium_priority")
|
||||||
def activity_task(activity_json):
|
def activity_task(activity_json):
|
||||||
"""do something with this json we think is legit"""
|
"""do something with this json we think is legit"""
|
||||||
# lets see if the activitypub module can make sense of this json
|
# lets see if the activitypub module can make sense of this json
|
||||||
|
|
|
@ -83,7 +83,7 @@ class Invite(View):
|
||||||
}
|
}
|
||||||
return TemplateResponse(request, "invite.html", data)
|
return TemplateResponse(request, "invite.html", data)
|
||||||
|
|
||||||
# post handling is in views.authentication.Register
|
# post handling is in views.register.Register
|
||||||
|
|
||||||
|
|
||||||
class ManageInviteRequests(View):
|
class ManageInviteRequests(View):
|
||||||
|
|
83
bookwyrm/views/login.py
Normal file
83
bookwyrm/views/login.py
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
""" class views for login/register views """
|
||||||
|
from django.contrib.auth import authenticate, login, logout
|
||||||
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from django.shortcuts import redirect
|
||||||
|
from django.template.response import TemplateResponse
|
||||||
|
from django.utils import timezone
|
||||||
|
from django.utils.decorators import method_decorator
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
from django.views import View
|
||||||
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
|
from django.views.decorators.debug import sensitive_variables, sensitive_post_parameters
|
||||||
|
|
||||||
|
from bookwyrm import forms, models
|
||||||
|
from bookwyrm.settings import DOMAIN
|
||||||
|
|
||||||
|
|
||||||
|
# pylint: disable=no-self-use
|
||||||
|
@method_decorator(csrf_exempt, name="dispatch")
|
||||||
|
class Login(View):
|
||||||
|
"""authenticate an existing user"""
|
||||||
|
|
||||||
|
def get(self, request, confirmed=None):
|
||||||
|
"""login page"""
|
||||||
|
if request.user.is_authenticated:
|
||||||
|
return redirect("/")
|
||||||
|
# send user to the login page
|
||||||
|
data = {
|
||||||
|
"show_confirmed_email": confirmed,
|
||||||
|
"login_form": forms.LoginForm(),
|
||||||
|
"register_form": forms.RegisterForm(),
|
||||||
|
}
|
||||||
|
return TemplateResponse(request, "login.html", data)
|
||||||
|
|
||||||
|
@sensitive_variables("password")
|
||||||
|
@method_decorator(sensitive_post_parameters("password"))
|
||||||
|
def post(self, request):
|
||||||
|
"""authentication action"""
|
||||||
|
if request.user.is_authenticated:
|
||||||
|
return redirect("/")
|
||||||
|
login_form = forms.LoginForm(request.POST)
|
||||||
|
|
||||||
|
localname = login_form.data["localname"]
|
||||||
|
if "@" in localname: # looks like an email address to me
|
||||||
|
try:
|
||||||
|
username = models.User.objects.get(email=localname).username
|
||||||
|
except models.User.DoesNotExist: # maybe it's a full username?
|
||||||
|
username = localname
|
||||||
|
else:
|
||||||
|
username = "%s@%s" % (localname, DOMAIN)
|
||||||
|
password = login_form.data["password"]
|
||||||
|
|
||||||
|
# perform authentication
|
||||||
|
user = authenticate(request, username=username, password=password)
|
||||||
|
if user is not None:
|
||||||
|
# successful login
|
||||||
|
login(request, user)
|
||||||
|
user.last_active_date = timezone.now()
|
||||||
|
user.save(broadcast=False, update_fields=["last_active_date"])
|
||||||
|
if request.POST.get("first_login"):
|
||||||
|
return redirect("get-started-profile")
|
||||||
|
return redirect(request.GET.get("next", "/"))
|
||||||
|
|
||||||
|
# maybe the user is pending email confirmation
|
||||||
|
if models.User.objects.filter(
|
||||||
|
username=username, is_active=False, deactivation_reason="pending"
|
||||||
|
).exists():
|
||||||
|
return redirect("confirm-email")
|
||||||
|
|
||||||
|
# login errors
|
||||||
|
login_form.non_field_errors = _("Username or password are incorrect")
|
||||||
|
register_form = forms.RegisterForm()
|
||||||
|
data = {"login_form": login_form, "register_form": register_form}
|
||||||
|
return TemplateResponse(request, "login.html", data)
|
||||||
|
|
||||||
|
|
||||||
|
@method_decorator(login_required, name="dispatch")
|
||||||
|
class Logout(View):
|
||||||
|
"""log out"""
|
||||||
|
|
||||||
|
def get(self, request):
|
||||||
|
"""done with this place! outa here!"""
|
||||||
|
logout(request)
|
||||||
|
return redirect("/")
|
|
@ -1,90 +1,23 @@
|
||||||
""" class views for login/register views """
|
""" class views for login/register views """
|
||||||
from django.contrib.auth import authenticate, login, logout
|
from django.contrib.auth import login
|
||||||
from django.contrib.auth.decorators import login_required
|
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
from django.shortcuts import get_object_or_404, redirect
|
from django.shortcuts import get_object_or_404, redirect
|
||||||
from django.template.response import TemplateResponse
|
from django.template.response import TemplateResponse
|
||||||
from django.utils import timezone
|
|
||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
from django.utils.translation import gettext_lazy as _
|
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
|
||||||
from django.views.decorators.http import require_POST
|
|
||||||
from django.views import View
|
from django.views import View
|
||||||
|
from django.views.decorators.http import require_POST
|
||||||
|
from django.views.decorators.debug import sensitive_variables, sensitive_post_parameters
|
||||||
|
|
||||||
from bookwyrm import emailing, forms, models
|
from bookwyrm import emailing, forms, models
|
||||||
from bookwyrm.settings import DOMAIN
|
from bookwyrm.settings import DOMAIN
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=no-self-use
|
# pylint: disable=no-self-use
|
||||||
@method_decorator(csrf_exempt, name="dispatch")
|
|
||||||
class Login(View):
|
|
||||||
"""authenticate an existing user"""
|
|
||||||
|
|
||||||
def get(self, request, confirmed=None):
|
|
||||||
"""login page"""
|
|
||||||
if request.user.is_authenticated:
|
|
||||||
return redirect("/")
|
|
||||||
# send user to the login page
|
|
||||||
data = {
|
|
||||||
"show_confirmed_email": confirmed,
|
|
||||||
"login_form": forms.LoginForm(),
|
|
||||||
"register_form": forms.RegisterForm(),
|
|
||||||
}
|
|
||||||
return TemplateResponse(request, "login.html", data)
|
|
||||||
|
|
||||||
def post(self, request):
|
|
||||||
"""authentication action"""
|
|
||||||
if request.user.is_authenticated:
|
|
||||||
return redirect("/")
|
|
||||||
login_form = forms.LoginForm(request.POST)
|
|
||||||
|
|
||||||
localname = login_form.data["localname"]
|
|
||||||
if "@" in localname: # looks like an email address to me
|
|
||||||
try:
|
|
||||||
username = models.User.objects.get(email=localname).username
|
|
||||||
except models.User.DoesNotExist: # maybe it's a full username?
|
|
||||||
username = localname
|
|
||||||
else:
|
|
||||||
username = "%s@%s" % (localname, DOMAIN)
|
|
||||||
password = login_form.data["password"]
|
|
||||||
|
|
||||||
# perform authentication
|
|
||||||
user = authenticate(request, username=username, password=password)
|
|
||||||
if user is not None:
|
|
||||||
# successful login
|
|
||||||
login(request, user)
|
|
||||||
user.last_active_date = timezone.now()
|
|
||||||
user.save(broadcast=False, update_fields=["last_active_date"])
|
|
||||||
if request.POST.get("first_login"):
|
|
||||||
return redirect("get-started-profile")
|
|
||||||
return redirect(request.GET.get("next", "/"))
|
|
||||||
|
|
||||||
# maybe the user is pending email confirmation
|
|
||||||
if models.User.objects.filter(
|
|
||||||
username=username, is_active=False, deactivation_reason="pending"
|
|
||||||
).exists():
|
|
||||||
return redirect("confirm-email")
|
|
||||||
|
|
||||||
# login errors
|
|
||||||
login_form.non_field_errors = _("Username or password are incorrect")
|
|
||||||
register_form = forms.RegisterForm()
|
|
||||||
data = {"login_form": login_form, "register_form": register_form}
|
|
||||||
return TemplateResponse(request, "login.html", data)
|
|
||||||
|
|
||||||
|
|
||||||
@method_decorator(login_required, name="dispatch")
|
|
||||||
class Logout(View):
|
|
||||||
"""log out"""
|
|
||||||
|
|
||||||
def get(self, request):
|
|
||||||
"""done with this place! outa here!"""
|
|
||||||
logout(request)
|
|
||||||
return redirect("/")
|
|
||||||
|
|
||||||
|
|
||||||
class Register(View):
|
class Register(View):
|
||||||
"""register a user"""
|
"""register a user"""
|
||||||
|
|
||||||
|
@sensitive_variables("password")
|
||||||
|
@method_decorator(sensitive_post_parameters("password"))
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
"""join the server"""
|
"""join the server"""
|
||||||
settings = models.SiteSettings.get()
|
settings = models.SiteSettings.get()
|
|
@ -3,7 +3,7 @@ from __future__ import absolute_import, unicode_literals
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from celery import Celery
|
from celery import Celery
|
||||||
from . import settings
|
from . import settings # pylint: disable=unused-import
|
||||||
|
|
||||||
|
|
||||||
# set the default Django settings module for the 'celery' program.
|
# set the default Django settings module for the 'celery' program.
|
||||||
|
@ -19,13 +19,3 @@ app.config_from_object("django.conf:settings", namespace="CELERY")
|
||||||
|
|
||||||
# Load task modules from all registered Django app configs.
|
# Load task modules from all registered Django app configs.
|
||||||
app.autodiscover_tasks()
|
app.autodiscover_tasks()
|
||||||
app.autodiscover_tasks(["bookwyrm"], related_name="activitypub.base_activity")
|
|
||||||
app.autodiscover_tasks(["bookwyrm"], related_name="activitystreams")
|
|
||||||
app.autodiscover_tasks(["bookwyrm"], related_name="broadcast")
|
|
||||||
app.autodiscover_tasks(["bookwyrm"], related_name="connectors.abstract_connector")
|
|
||||||
app.autodiscover_tasks(["bookwyrm"], related_name="emailing")
|
|
||||||
app.autodiscover_tasks(["bookwyrm"], related_name="goodreads_import")
|
|
||||||
app.autodiscover_tasks(["bookwyrm"], related_name="preview_images")
|
|
||||||
app.autodiscover_tasks(["bookwyrm"], related_name="models.user")
|
|
||||||
app.autodiscover_tasks(["bookwyrm"], related_name="suggested_users")
|
|
||||||
app.autodiscover_tasks(["bookwyrm"], related_name="views.inbox")
|
|
||||||
|
|
|
@ -1,9 +1,20 @@
|
||||||
""" bookwyrm settings and configuration """
|
""" bookwyrm settings and configuration """
|
||||||
|
# pylint: disable=wildcard-import
|
||||||
|
# pylint: disable=unused-wildcard-import
|
||||||
from bookwyrm.settings import *
|
from bookwyrm.settings import *
|
||||||
|
|
||||||
CELERY_BROKER_URL = CELERY_BROKER
|
CELERY_BROKER_URL = "redis://:{}@redis_broker:{}/0".format(
|
||||||
|
requests.utils.quote(env("REDIS_BROKER_PASSWORD", "")), env("REDIS_BROKER_PORT")
|
||||||
|
)
|
||||||
|
CELERY_RESULT_BACKEND = "redis://:{}@redis_broker:{}/0".format(
|
||||||
|
requests.utils.quote(env("REDIS_BROKER_PASSWORD", "")), env("REDIS_BROKER_PORT")
|
||||||
|
)
|
||||||
|
|
||||||
|
CELERY_DEFAULT_QUEUE = "low_priority"
|
||||||
|
|
||||||
CELERY_ACCEPT_CONTENT = ["json"]
|
CELERY_ACCEPT_CONTENT = ["json"]
|
||||||
CELERY_TASK_SERIALIZER = "json"
|
CELERY_TASK_SERIALIZER = "json"
|
||||||
|
CELERY_RESULT_SERIALIZER = "json"
|
||||||
FLOWER_PORT = env("FLOWER_PORT")
|
FLOWER_PORT = env("FLOWER_PORT")
|
||||||
|
|
||||||
INSTALLED_APPS = INSTALLED_APPS + [
|
INSTALLED_APPS = INSTALLED_APPS + [
|
||||||
|
|
|
@ -79,7 +79,7 @@ services:
|
||||||
build: .
|
build: .
|
||||||
networks:
|
networks:
|
||||||
- main
|
- main
|
||||||
command: celery -A celerywyrm worker -l info
|
command: celery -A celerywyrm worker -l info -Q high_priority,medium_priority,low_priority
|
||||||
volumes:
|
volumes:
|
||||||
- .:/app
|
- .:/app
|
||||||
- static_volume:/app/static
|
- static_volume:/app/static
|
||||||
|
|
Binary file not shown.
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 0.0.1\n"
|
"Project-Id-Version: 0.0.1\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-09-05 23:09+0000\n"
|
"POT-Creation-Date: 2021-09-08 15:57+0000\n"
|
||||||
"PO-Revision-Date: 2021-03-02 17:19-0800\n"
|
"PO-Revision-Date: 2021-03-02 17:19-0800\n"
|
||||||
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
|
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
|
||||||
"Language-Team: English <LL@li.org>\n"
|
"Language-Team: English <LL@li.org>\n"
|
||||||
|
@ -102,21 +102,21 @@ msgstr "Username"
|
||||||
msgid "A user with that username already exists."
|
msgid "A user with that username already exists."
|
||||||
msgstr "Dieser Benutzename ist bereits vergeben."
|
msgstr "Dieser Benutzename ist bereits vergeben."
|
||||||
|
|
||||||
#: bookwyrm/settings.py:124
|
#: bookwyrm/settings.py:113
|
||||||
msgid "Home Timeline"
|
msgid "Home Timeline"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/settings.py:124
|
#: bookwyrm/settings.py:113
|
||||||
msgid "Home"
|
msgid "Home"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/settings.py:125
|
#: bookwyrm/settings.py:114
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Title"
|
#| msgid "Title"
|
||||||
msgid "Books Timeline"
|
msgid "Books Timeline"
|
||||||
msgstr "Titel"
|
msgstr "Titel"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:125 bookwyrm/templates/search/layout.html:21
|
#: bookwyrm/settings.py:114 bookwyrm/templates/search/layout.html:21
|
||||||
#: bookwyrm/templates/search/layout.html:42
|
#: bookwyrm/templates/search/layout.html:42
|
||||||
#: bookwyrm/templates/user/layout.html:81
|
#: bookwyrm/templates/user/layout.html:81
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
|
@ -124,27 +124,27 @@ msgstr "Titel"
|
||||||
msgid "Books"
|
msgid "Books"
|
||||||
msgstr "Buch"
|
msgstr "Buch"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:171
|
#: bookwyrm/settings.py:160
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "Englisch"
|
msgstr "Englisch"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:172
|
#: bookwyrm/settings.py:161
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr "Deutsch"
|
msgstr "Deutsch"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:173
|
#: bookwyrm/settings.py:162
|
||||||
msgid "Spanish"
|
msgid "Spanish"
|
||||||
msgstr "Spanisch"
|
msgstr "Spanisch"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:174
|
#: bookwyrm/settings.py:163
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr "Französisch"
|
msgstr "Französisch"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:175
|
#: bookwyrm/settings.py:164
|
||||||
msgid "Simplified Chinese"
|
msgid "Simplified Chinese"
|
||||||
msgstr "Vereinfachtes Chinesisch"
|
msgstr "Vereinfachtes Chinesisch"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:176
|
#: bookwyrm/settings.py:165
|
||||||
msgid "Traditional Chinese"
|
msgid "Traditional Chinese"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -303,7 +303,7 @@ msgstr ""
|
||||||
#: bookwyrm/templates/book/edit_book.html:328
|
#: bookwyrm/templates/book/edit_book.html:328
|
||||||
#: bookwyrm/templates/book/readthrough.html:76
|
#: bookwyrm/templates/book/readthrough.html:76
|
||||||
#: bookwyrm/templates/lists/bookmark_button.html:15
|
#: bookwyrm/templates/lists/bookmark_button.html:15
|
||||||
#: bookwyrm/templates/lists/form.html:42
|
#: bookwyrm/templates/lists/form.html:44
|
||||||
#: bookwyrm/templates/preferences/edit_user.html:78
|
#: bookwyrm/templates/preferences/edit_user.html:78
|
||||||
#: bookwyrm/templates/settings/announcement_form.html:69
|
#: bookwyrm/templates/settings/announcement_form.html:69
|
||||||
#: bookwyrm/templates/settings/edit_server.html:68
|
#: bookwyrm/templates/settings/edit_server.html:68
|
||||||
|
@ -320,6 +320,7 @@ msgstr "Speichern"
|
||||||
#: bookwyrm/templates/book/cover_modal.html:32
|
#: bookwyrm/templates/book/cover_modal.html:32
|
||||||
#: bookwyrm/templates/book/edit_book.html:329
|
#: bookwyrm/templates/book/edit_book.html:329
|
||||||
#: bookwyrm/templates/book/readthrough.html:77
|
#: bookwyrm/templates/book/readthrough.html:77
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:17
|
||||||
#: bookwyrm/templates/moderation/report_modal.html:34
|
#: bookwyrm/templates/moderation/report_modal.html:34
|
||||||
#: bookwyrm/templates/settings/federated_server.html:99
|
#: bookwyrm/templates/settings/federated_server.html:99
|
||||||
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
|
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
|
||||||
|
@ -731,6 +732,7 @@ msgstr "Suchergebnisse"
|
||||||
|
|
||||||
#: bookwyrm/templates/components/inline_form.html:8
|
#: bookwyrm/templates/components/inline_form.html:8
|
||||||
#: bookwyrm/templates/components/modal.html:11
|
#: bookwyrm/templates/components/modal.html:11
|
||||||
|
#: bookwyrm/templates/components/tooltip.html:7
|
||||||
#: bookwyrm/templates/feed/layout.html:71
|
#: bookwyrm/templates/feed/layout.html:71
|
||||||
#: bookwyrm/templates/get_started/layout.html:20
|
#: bookwyrm/templates/get_started/layout.html:20
|
||||||
#: bookwyrm/templates/get_started/layout.html:53
|
#: bookwyrm/templates/get_started/layout.html:53
|
||||||
|
@ -739,6 +741,10 @@ msgstr "Suchergebnisse"
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Schließen"
|
msgstr "Schließen"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/components/tooltip.html:3
|
||||||
|
msgid "Help"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8
|
#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Boost status"
|
#| msgid "Boost status"
|
||||||
|
@ -766,6 +772,7 @@ msgid "Sorry! We couldn't find that code."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/confirm_email/confirm_email.html:19
|
#: bookwyrm/templates/confirm_email/confirm_email.html:19
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:100
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Confirm password:"
|
#| msgid "Confirm password:"
|
||||||
msgid "Confirmation code:"
|
msgid "Confirmation code:"
|
||||||
|
@ -1283,125 +1290,130 @@ msgstr "Deine Bücher %(year)s"
|
||||||
msgid "%(username)s's %(year)s Books"
|
msgid "%(username)s's %(year)s Books"
|
||||||
msgstr "%(username)ss %(year)s Bücher"
|
msgstr "%(username)ss %(year)s Bücher"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9
|
#: bookwyrm/templates/import/import.html:5
|
||||||
|
#: bookwyrm/templates/import/import.html:9
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:57
|
#: bookwyrm/templates/user/shelf/shelf.html:57
|
||||||
msgid "Import Books"
|
msgid "Import Books"
|
||||||
msgstr "Bücher importieren"
|
msgstr "Bücher importieren"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:16
|
#: bookwyrm/templates/import/import.html:18
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Data source"
|
#| msgid "Data source"
|
||||||
msgid "Data source:"
|
msgid "Data source:"
|
||||||
msgstr "Datenquelle"
|
msgstr "Datenquelle"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:32
|
#: bookwyrm/templates/import/import.html:37
|
||||||
msgid "Data file:"
|
msgid "Data file:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:40
|
#: bookwyrm/templates/import/import.html:45
|
||||||
msgid "Include reviews"
|
msgid "Include reviews"
|
||||||
msgstr "Bewertungen importieren"
|
msgstr "Bewertungen importieren"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:45
|
#: bookwyrm/templates/import/import.html:50
|
||||||
msgid "Privacy setting for imported reviews:"
|
msgid "Privacy setting for imported reviews:"
|
||||||
msgstr "Datenschutzeinstellung für importierte Bewertungen"
|
msgstr "Datenschutzeinstellung für importierte Bewertungen"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:51
|
#: bookwyrm/templates/import/import.html:56
|
||||||
#: bookwyrm/templates/settings/server_blocklist.html:64
|
#: bookwyrm/templates/settings/server_blocklist.html:64
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "Importieren"
|
msgstr "Importieren"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:56
|
#: bookwyrm/templates/import/import.html:61
|
||||||
msgid "Recent Imports"
|
msgid "Recent Imports"
|
||||||
msgstr "Aktuelle Importe"
|
msgstr "Aktuelle Importe"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:58
|
#: bookwyrm/templates/import/import.html:63
|
||||||
msgid "No recent imports"
|
msgid "No recent imports"
|
||||||
msgstr "Keine aktuellen Importe"
|
msgstr "Keine aktuellen Importe"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:6
|
#: bookwyrm/templates/import/import_status.html:6
|
||||||
#: bookwyrm/templates/import_status.html:10
|
#: bookwyrm/templates/import/import_status.html:10
|
||||||
msgid "Import Status"
|
msgid "Import Status"
|
||||||
msgstr "Importstatus"
|
msgstr "Importstatus"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:11
|
#: bookwyrm/templates/import/import_status.html:11
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Back to reports"
|
#| msgid "Back to reports"
|
||||||
msgid "Back to imports"
|
msgid "Back to imports"
|
||||||
msgstr "Zurück zu den Meldungen"
|
msgstr "Zurück zu den Meldungen"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:15
|
#: bookwyrm/templates/import/import_status.html:15
|
||||||
msgid "Import started:"
|
msgid "Import started:"
|
||||||
msgstr "Import gestartet:"
|
msgstr "Import gestartet:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:20
|
#: bookwyrm/templates/import/import_status.html:20
|
||||||
msgid "Import completed:"
|
msgid "Import completed:"
|
||||||
msgstr "Import abgeschlossen:"
|
msgstr "Import abgeschlossen:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:24
|
#: bookwyrm/templates/import/import_status.html:24
|
||||||
msgid "TASK FAILED"
|
msgid "TASK FAILED"
|
||||||
msgstr "AUFGABE GESCHEITERT"
|
msgstr "AUFGABE GESCHEITERT"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:32
|
#: bookwyrm/templates/import/import_status.html:32
|
||||||
msgid "Import still in progress."
|
msgid "Import still in progress."
|
||||||
msgstr "Import läuft noch."
|
msgstr "Import läuft noch."
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:34
|
#: bookwyrm/templates/import/import_status.html:34
|
||||||
msgid "(Hit reload to update!)"
|
msgid "(Hit reload to update!)"
|
||||||
msgstr "(Aktualisiere für ein Update!)"
|
msgstr "(Aktualisiere für ein Update!)"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:41
|
#: bookwyrm/templates/import/import_status.html:41
|
||||||
msgid "Failed to load"
|
msgid "Failed to load"
|
||||||
msgstr "Laden fehlgeschlagen"
|
msgstr "Laden fehlgeschlagen"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:50
|
#: bookwyrm/templates/import/import_status.html:50
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
|
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
|
||||||
msgstr "Zum Ende der Liste springen, um die %(failed_count)s Einträge, deren Import fehlschlug, auszuwählen."
|
msgstr "Zum Ende der Liste springen, um die %(failed_count)s Einträge, deren Import fehlschlug, auszuwählen."
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:62
|
#: bookwyrm/templates/import/import_status.html:62
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Line %(index)s: <strong>%(title)s</strong> by %(author)s"
|
msgid "Line %(index)s: <strong>%(title)s</strong> by %(author)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:82
|
#: bookwyrm/templates/import/import_status.html:82
|
||||||
msgid "Select all"
|
msgid "Select all"
|
||||||
msgstr "Alle auswählen"
|
msgstr "Alle auswählen"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:85
|
#: bookwyrm/templates/import/import_status.html:85
|
||||||
msgid "Retry items"
|
msgid "Retry items"
|
||||||
msgstr "Punkte erneut versuchen"
|
msgstr "Punkte erneut versuchen"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:112
|
#: bookwyrm/templates/import/import_status.html:112
|
||||||
msgid "Successfully imported"
|
msgid "Successfully imported"
|
||||||
msgstr "Erfolgreich importiert"
|
msgstr "Erfolgreich importiert"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:114
|
#: bookwyrm/templates/import/import_status.html:114
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Import still in progress."
|
#| msgid "Import still in progress."
|
||||||
msgid "Import Progress"
|
msgid "Import Progress"
|
||||||
msgstr "Import läuft noch."
|
msgstr "Import läuft noch."
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:119
|
#: bookwyrm/templates/import/import_status.html:119
|
||||||
msgid "Book"
|
msgid "Book"
|
||||||
msgstr "Buch"
|
msgstr "Buch"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:122
|
#: bookwyrm/templates/import/import_status.html:122
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:111
|
#: bookwyrm/templates/user/shelf/shelf.html:111
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:131
|
#: bookwyrm/templates/user/shelf/shelf.html:131
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Titel"
|
msgstr "Titel"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:125
|
#: bookwyrm/templates/import/import_status.html:125
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:112
|
#: bookwyrm/templates/user/shelf/shelf.html:112
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:134
|
#: bookwyrm/templates/user/shelf/shelf.html:134
|
||||||
msgid "Author"
|
msgid "Author"
|
||||||
msgstr "Autor*in"
|
msgstr "Autor*in"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:148
|
#: bookwyrm/templates/import/import_status.html:148
|
||||||
msgid "Imported"
|
msgid "Imported"
|
||||||
msgstr "Importiert"
|
msgstr "Importiert"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/import/tooltip.html:6
|
||||||
|
msgid "You can download your GoodReads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener\">Import/Export page</a> of your GoodReads account."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12
|
#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12
|
||||||
#: bookwyrm/templates/login.html:51
|
#: bookwyrm/templates/login.html:51
|
||||||
msgid "Create an Account"
|
msgid "Create an Account"
|
||||||
|
@ -1605,8 +1617,27 @@ msgstr "Bestätigen"
|
||||||
msgid "Discard"
|
msgid "Discard"
|
||||||
msgstr "Ablehnen"
|
msgstr "Ablehnen"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:4
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Delete this progress update"
|
||||||
|
msgid "Delete this list?"
|
||||||
|
msgstr "Dieses Fortschrittsupdate löschen"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:7
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "This shelf is empty."
|
||||||
|
msgid "This action cannot be un-done"
|
||||||
|
msgstr "Dieses Regal ist leer."
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:15
|
||||||
|
#: bookwyrm/templates/settings/announcement.html:20
|
||||||
|
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15
|
||||||
|
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
|
||||||
|
msgid "Delete"
|
||||||
|
msgstr "Löschen"
|
||||||
|
|
||||||
#: bookwyrm/templates/lists/edit_form.html:5
|
#: bookwyrm/templates/lists/edit_form.html:5
|
||||||
#: bookwyrm/templates/lists/list_layout.html:16
|
#: bookwyrm/templates/lists/layout.html:16
|
||||||
msgid "Edit List"
|
msgid "Edit List"
|
||||||
msgstr "Liste bearbeiten"
|
msgstr "Liste bearbeiten"
|
||||||
|
|
||||||
|
@ -1641,6 +1672,12 @@ msgstr "Offen"
|
||||||
msgid "Anyone can add books to this list"
|
msgid "Anyone can add books to this list"
|
||||||
msgstr "Alle können Bücher hinzufügen"
|
msgstr "Alle können Bücher hinzufügen"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/form.html:49
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Delete status"
|
||||||
|
msgid "Delete list"
|
||||||
|
msgstr "Post löschen"
|
||||||
|
|
||||||
#: bookwyrm/templates/lists/list.html:20
|
#: bookwyrm/templates/lists/list.html:20
|
||||||
msgid "You successfully suggested a book for this list!"
|
msgid "You successfully suggested a book for this list!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2070,6 +2107,7 @@ msgid "Account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/preferences/layout.html:15
|
#: bookwyrm/templates/preferences/layout.html:15
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:7
|
||||||
msgid "Profile"
|
msgid "Profile"
|
||||||
msgstr "Profil"
|
msgstr "Profil"
|
||||||
|
|
||||||
|
@ -2208,12 +2246,6 @@ msgstr "Zurück zu den Meldungen"
|
||||||
msgid "Edit Announcement"
|
msgid "Edit Announcement"
|
||||||
msgstr "Ankündigungen"
|
msgstr "Ankündigungen"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/announcement.html:20
|
|
||||||
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15
|
|
||||||
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
|
|
||||||
msgid "Delete"
|
|
||||||
msgstr "Löschen"
|
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/announcement.html:35
|
#: bookwyrm/templates/settings/announcement.html:35
|
||||||
msgid "Visible:"
|
msgid "Visible:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2280,6 +2312,7 @@ msgstr "Lesedaten bearbeiten"
|
||||||
#: bookwyrm/templates/settings/manage_invite_requests.html:44
|
#: bookwyrm/templates/settings/manage_invite_requests.html:44
|
||||||
#: bookwyrm/templates/settings/status_filter.html:5
|
#: bookwyrm/templates/settings/status_filter.html:5
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:34
|
#: bookwyrm/templates/user_admin/user_admin.html:34
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:20
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2329,7 +2362,7 @@ msgstr "Instanzname"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:37
|
#: bookwyrm/templates/settings/edit_server.html:37
|
||||||
#: bookwyrm/templates/settings/federated_server.html:31
|
#: bookwyrm/templates/settings/federated_server.html:31
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:34
|
#: bookwyrm/templates/user_admin/user_info.html:125
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Import Status"
|
#| msgid "Import Status"
|
||||||
msgid "Status:"
|
msgid "Status:"
|
||||||
|
@ -2348,13 +2381,13 @@ msgstr "Blockierte Nutzer*innen"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:48
|
#: bookwyrm/templates/settings/edit_server.html:48
|
||||||
#: bookwyrm/templates/settings/federated_server.html:23
|
#: bookwyrm/templates/settings/federated_server.html:23
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:26
|
#: bookwyrm/templates/user_admin/user_info.html:117
|
||||||
msgid "Software:"
|
msgid "Software:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:55
|
#: bookwyrm/templates/settings/edit_server.html:55
|
||||||
#: bookwyrm/templates/settings/federated_server.html:27
|
#: bookwyrm/templates/settings/federated_server.html:27
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:30
|
#: bookwyrm/templates/user_admin/user_info.html:121
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Description:"
|
#| msgid "Description:"
|
||||||
msgid "Version:"
|
msgid "Version:"
|
||||||
|
@ -2383,6 +2416,7 @@ msgid "View all"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/federated_server.html:50
|
#: bookwyrm/templates/settings/federated_server.html:50
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:59
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Recent Imports"
|
#| msgid "Recent Imports"
|
||||||
msgid "Reports:"
|
msgid "Reports:"
|
||||||
|
@ -2407,7 +2441,7 @@ msgid "Blocked by us:"
|
||||||
msgstr "Blockierte Nutzer*innen"
|
msgstr "Blockierte Nutzer*innen"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/federated_server.html:82
|
#: bookwyrm/templates/settings/federated_server.html:82
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:39
|
#: bookwyrm/templates/user_admin/user_info.html:130
|
||||||
msgid "Notes"
|
msgid "Notes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -3428,7 +3462,7 @@ msgstr[1] "folgt dir"
|
||||||
msgid "No followers you follow"
|
msgid "No followers you follow"
|
||||||
msgstr "folgt dir"
|
msgstr "folgt dir"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user.html:9
|
#: bookwyrm/templates/user_admin/user.html:8
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Back to reports"
|
#| msgid "Back to reports"
|
||||||
msgid "Back to users"
|
msgid "Back to users"
|
||||||
|
@ -3464,37 +3498,89 @@ msgid "Remote instance"
|
||||||
msgstr "Instanzname"
|
msgstr "Instanzname"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:47
|
#: bookwyrm/templates/user_admin/user_admin.html:47
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:24
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Activity"
|
#| msgid "Activity"
|
||||||
msgid "Active"
|
msgid "Active"
|
||||||
msgstr "Aktivität"
|
msgstr "Aktivität"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:47
|
#: bookwyrm/templates/user_admin/user_admin.html:47
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:28
|
||||||
msgid "Inactive"
|
msgid "Inactive"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:52
|
#: bookwyrm/templates/user_admin/user_admin.html:52
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:49
|
#: bookwyrm/templates/user_admin/user_info.html:140
|
||||||
msgid "Not set"
|
msgid "Not set"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:5
|
#: bookwyrm/templates/user_admin/user_info.html:16
|
||||||
msgid "User details"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:14
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "User Profile"
|
#| msgid "User Profile"
|
||||||
msgid "View user profile"
|
msgid "View user profile"
|
||||||
msgstr "Benutzerprofil"
|
msgstr "Benutzerprofil"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:20
|
#: bookwyrm/templates/user_admin/user_info.html:36
|
||||||
|
msgid "Local"
|
||||||
|
msgstr "Lokal"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:38
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Remove"
|
||||||
|
msgid "Remote"
|
||||||
|
msgstr "Entfernen"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:47
|
||||||
|
msgid "User details"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:52
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Email address:"
|
||||||
|
msgid "Email:"
|
||||||
|
msgstr "E-Mail Adresse"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:64
|
||||||
|
msgid "(View reports)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:72
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Blocked Users"
|
||||||
|
msgid "Blocked by count:"
|
||||||
|
msgstr "Blockierte Nutzer*innen"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:77
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Birth date:"
|
||||||
|
msgid "Last active date:"
|
||||||
|
msgstr "Geburtsdatum:"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:82
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Manually approve followers:"
|
||||||
|
msgid "Manually approved followers:"
|
||||||
|
msgstr "Folgende manuell bestätigen"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:87
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Discard"
|
||||||
|
msgid "Discoverable:"
|
||||||
|
msgstr "Ablehnen"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:93
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Deactivate user"
|
||||||
|
msgid "Deactivation reason:"
|
||||||
|
msgstr "Nutzer:in deaktivieren"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:111
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Instance Settings"
|
#| msgid "Instance Settings"
|
||||||
msgid "Instance details"
|
msgid "Instance details"
|
||||||
msgstr "Instanzeinstellungen"
|
msgstr "Instanzeinstellungen"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:46
|
#: bookwyrm/templates/user_admin/user_info.html:137
|
||||||
msgid "View instance"
|
msgid "View instance"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -3523,16 +3609,16 @@ msgstr ""
|
||||||
msgid "%(title)s: %(subtitle)s"
|
msgid "%(title)s: %(subtitle)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/views/authentication.py:69
|
|
||||||
msgid "Username or password are incorrect"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: bookwyrm/views/import_data.py:67
|
#: bookwyrm/views/import_data.py:67
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Email address:"
|
#| msgid "Email address:"
|
||||||
msgid "Not a valid csv file"
|
msgid "Not a valid csv file"
|
||||||
msgstr "E-Mail Adresse"
|
msgstr "E-Mail Adresse"
|
||||||
|
|
||||||
|
#: bookwyrm/views/login.py:70
|
||||||
|
msgid "Username or password are incorrect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/views/password.py:32
|
#: bookwyrm/views/password.py:32
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "A user with that username already exists."
|
#| msgid "A user with that username already exists."
|
||||||
|
@ -3560,9 +3646,6 @@ msgstr ""
|
||||||
#~ msgid "Federated Timeline"
|
#~ msgid "Federated Timeline"
|
||||||
#~ msgstr "Föderierende Server"
|
#~ msgstr "Föderierende Server"
|
||||||
|
|
||||||
#~ msgid "Local"
|
|
||||||
#~ msgstr "Lokal"
|
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "Lists: %(username)s"
|
#~| msgid "Lists: %(username)s"
|
||||||
#~ msgid "Reports: <small>%(server_name)s</small>"
|
#~ msgid "Reports: <small>%(server_name)s</small>"
|
||||||
|
@ -3639,11 +3722,6 @@ msgstr ""
|
||||||
#~ msgid "Value %(value)r is not a valid choice."
|
#~ msgid "Value %(value)r is not a valid choice."
|
||||||
#~ msgstr "%(value)s ist keine gültige remote_id"
|
#~ msgstr "%(value)s ist keine gültige remote_id"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
#~| msgid "This shelf is empty."
|
|
||||||
#~ msgid "This field cannot be null."
|
|
||||||
#~ msgstr "Dieses Regal ist leer."
|
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "A user with that username already exists."
|
#~| msgid "A user with that username already exists."
|
||||||
#~ msgid "%(model_name)s with this %(field_label)s already exists."
|
#~ msgid "%(model_name)s with this %(field_label)s already exists."
|
||||||
|
@ -3873,9 +3951,6 @@ msgstr ""
|
||||||
#~ msgid "by %(author)s"
|
#~ msgid "by %(author)s"
|
||||||
#~ msgstr "von %(author)s"
|
#~ msgstr "von %(author)s"
|
||||||
|
|
||||||
#~ msgid "Deactivate user"
|
|
||||||
#~ msgstr "Nutzer:in deaktivieren"
|
|
||||||
|
|
||||||
#~ msgid "Reactivate user"
|
#~ msgid "Reactivate user"
|
||||||
#~ msgstr "Nutzer:in reaktivieren"
|
#~ msgstr "Nutzer:in reaktivieren"
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 0.0.1\n"
|
"Project-Id-Version: 0.0.1\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-09-05 23:09+0000\n"
|
"POT-Creation-Date: 2021-09-08 15:57+0000\n"
|
||||||
"PO-Revision-Date: 2021-02-28 17:19-0800\n"
|
"PO-Revision-Date: 2021-02-28 17:19-0800\n"
|
||||||
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
|
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
|
||||||
"Language-Team: English <LL@li.org>\n"
|
"Language-Team: English <LL@li.org>\n"
|
||||||
|
@ -92,45 +92,45 @@ msgstr ""
|
||||||
msgid "A user with that username already exists."
|
msgid "A user with that username already exists."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/settings.py:124
|
#: bookwyrm/settings.py:113
|
||||||
msgid "Home Timeline"
|
msgid "Home Timeline"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/settings.py:124
|
#: bookwyrm/settings.py:113
|
||||||
msgid "Home"
|
msgid "Home"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/settings.py:125
|
#: bookwyrm/settings.py:114
|
||||||
msgid "Books Timeline"
|
msgid "Books Timeline"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/settings.py:125 bookwyrm/templates/search/layout.html:21
|
#: bookwyrm/settings.py:114 bookwyrm/templates/search/layout.html:21
|
||||||
#: bookwyrm/templates/search/layout.html:42
|
#: bookwyrm/templates/search/layout.html:42
|
||||||
#: bookwyrm/templates/user/layout.html:81
|
#: bookwyrm/templates/user/layout.html:81
|
||||||
msgid "Books"
|
msgid "Books"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/settings.py:171
|
#: bookwyrm/settings.py:160
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/settings.py:172
|
#: bookwyrm/settings.py:161
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/settings.py:173
|
#: bookwyrm/settings.py:162
|
||||||
msgid "Spanish"
|
msgid "Spanish"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/settings.py:174
|
#: bookwyrm/settings.py:163
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/settings.py:175
|
#: bookwyrm/settings.py:164
|
||||||
msgid "Simplified Chinese"
|
msgid "Simplified Chinese"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/settings.py:176
|
#: bookwyrm/settings.py:165
|
||||||
msgid "Traditional Chinese"
|
msgid "Traditional Chinese"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -279,7 +279,7 @@ msgstr ""
|
||||||
#: bookwyrm/templates/book/edit_book.html:328
|
#: bookwyrm/templates/book/edit_book.html:328
|
||||||
#: bookwyrm/templates/book/readthrough.html:76
|
#: bookwyrm/templates/book/readthrough.html:76
|
||||||
#: bookwyrm/templates/lists/bookmark_button.html:15
|
#: bookwyrm/templates/lists/bookmark_button.html:15
|
||||||
#: bookwyrm/templates/lists/form.html:42
|
#: bookwyrm/templates/lists/form.html:44
|
||||||
#: bookwyrm/templates/preferences/edit_user.html:78
|
#: bookwyrm/templates/preferences/edit_user.html:78
|
||||||
#: bookwyrm/templates/settings/announcement_form.html:69
|
#: bookwyrm/templates/settings/announcement_form.html:69
|
||||||
#: bookwyrm/templates/settings/edit_server.html:68
|
#: bookwyrm/templates/settings/edit_server.html:68
|
||||||
|
@ -296,6 +296,7 @@ msgstr ""
|
||||||
#: bookwyrm/templates/book/cover_modal.html:32
|
#: bookwyrm/templates/book/cover_modal.html:32
|
||||||
#: bookwyrm/templates/book/edit_book.html:329
|
#: bookwyrm/templates/book/edit_book.html:329
|
||||||
#: bookwyrm/templates/book/readthrough.html:77
|
#: bookwyrm/templates/book/readthrough.html:77
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:17
|
||||||
#: bookwyrm/templates/moderation/report_modal.html:34
|
#: bookwyrm/templates/moderation/report_modal.html:34
|
||||||
#: bookwyrm/templates/settings/federated_server.html:99
|
#: bookwyrm/templates/settings/federated_server.html:99
|
||||||
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
|
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
|
||||||
|
@ -672,6 +673,7 @@ msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/components/inline_form.html:8
|
#: bookwyrm/templates/components/inline_form.html:8
|
||||||
#: bookwyrm/templates/components/modal.html:11
|
#: bookwyrm/templates/components/modal.html:11
|
||||||
|
#: bookwyrm/templates/components/tooltip.html:7
|
||||||
#: bookwyrm/templates/feed/layout.html:71
|
#: bookwyrm/templates/feed/layout.html:71
|
||||||
#: bookwyrm/templates/get_started/layout.html:20
|
#: bookwyrm/templates/get_started/layout.html:20
|
||||||
#: bookwyrm/templates/get_started/layout.html:53
|
#: bookwyrm/templates/get_started/layout.html:53
|
||||||
|
@ -680,6 +682,10 @@ msgstr ""
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/components/tooltip.html:3
|
||||||
|
msgid "Help"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8
|
#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8
|
||||||
msgid "Compose status"
|
msgid "Compose status"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -701,6 +707,7 @@ msgid "Sorry! We couldn't find that code."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/confirm_email/confirm_email.html:19
|
#: bookwyrm/templates/confirm_email/confirm_email.html:19
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:100
|
||||||
msgid "Confirmation code:"
|
msgid "Confirmation code:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1168,119 +1175,124 @@ msgstr ""
|
||||||
msgid "%(username)s's %(year)s Books"
|
msgid "%(username)s's %(year)s Books"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9
|
#: bookwyrm/templates/import/import.html:5
|
||||||
|
#: bookwyrm/templates/import/import.html:9
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:57
|
#: bookwyrm/templates/user/shelf/shelf.html:57
|
||||||
msgid "Import Books"
|
msgid "Import Books"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:16
|
#: bookwyrm/templates/import/import.html:18
|
||||||
msgid "Data source:"
|
msgid "Data source:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:32
|
#: bookwyrm/templates/import/import.html:37
|
||||||
msgid "Data file:"
|
msgid "Data file:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:40
|
#: bookwyrm/templates/import/import.html:45
|
||||||
msgid "Include reviews"
|
msgid "Include reviews"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:45
|
#: bookwyrm/templates/import/import.html:50
|
||||||
msgid "Privacy setting for imported reviews:"
|
msgid "Privacy setting for imported reviews:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:51
|
#: bookwyrm/templates/import/import.html:56
|
||||||
#: bookwyrm/templates/settings/server_blocklist.html:64
|
#: bookwyrm/templates/settings/server_blocklist.html:64
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:56
|
#: bookwyrm/templates/import/import.html:61
|
||||||
msgid "Recent Imports"
|
msgid "Recent Imports"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:58
|
#: bookwyrm/templates/import/import.html:63
|
||||||
msgid "No recent imports"
|
msgid "No recent imports"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:6
|
#: bookwyrm/templates/import/import_status.html:6
|
||||||
#: bookwyrm/templates/import_status.html:10
|
#: bookwyrm/templates/import/import_status.html:10
|
||||||
msgid "Import Status"
|
msgid "Import Status"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:11
|
#: bookwyrm/templates/import/import_status.html:11
|
||||||
msgid "Back to imports"
|
msgid "Back to imports"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:15
|
#: bookwyrm/templates/import/import_status.html:15
|
||||||
msgid "Import started:"
|
msgid "Import started:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:20
|
#: bookwyrm/templates/import/import_status.html:20
|
||||||
msgid "Import completed:"
|
msgid "Import completed:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:24
|
#: bookwyrm/templates/import/import_status.html:24
|
||||||
msgid "TASK FAILED"
|
msgid "TASK FAILED"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:32
|
#: bookwyrm/templates/import/import_status.html:32
|
||||||
msgid "Import still in progress."
|
msgid "Import still in progress."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:34
|
#: bookwyrm/templates/import/import_status.html:34
|
||||||
msgid "(Hit reload to update!)"
|
msgid "(Hit reload to update!)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:41
|
#: bookwyrm/templates/import/import_status.html:41
|
||||||
msgid "Failed to load"
|
msgid "Failed to load"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:50
|
#: bookwyrm/templates/import/import_status.html:50
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
|
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:62
|
#: bookwyrm/templates/import/import_status.html:62
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Line %(index)s: <strong>%(title)s</strong> by %(author)s"
|
msgid "Line %(index)s: <strong>%(title)s</strong> by %(author)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:82
|
#: bookwyrm/templates/import/import_status.html:82
|
||||||
msgid "Select all"
|
msgid "Select all"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:85
|
#: bookwyrm/templates/import/import_status.html:85
|
||||||
msgid "Retry items"
|
msgid "Retry items"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:112
|
#: bookwyrm/templates/import/import_status.html:112
|
||||||
msgid "Successfully imported"
|
msgid "Successfully imported"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:114
|
#: bookwyrm/templates/import/import_status.html:114
|
||||||
msgid "Import Progress"
|
msgid "Import Progress"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:119
|
#: bookwyrm/templates/import/import_status.html:119
|
||||||
msgid "Book"
|
msgid "Book"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:122
|
#: bookwyrm/templates/import/import_status.html:122
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:111
|
#: bookwyrm/templates/user/shelf/shelf.html:111
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:131
|
#: bookwyrm/templates/user/shelf/shelf.html:131
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:125
|
#: bookwyrm/templates/import/import_status.html:125
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:112
|
#: bookwyrm/templates/user/shelf/shelf.html:112
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:134
|
#: bookwyrm/templates/user/shelf/shelf.html:134
|
||||||
msgid "Author"
|
msgid "Author"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:148
|
#: bookwyrm/templates/import/import_status.html:148
|
||||||
msgid "Imported"
|
msgid "Imported"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/import/tooltip.html:6
|
||||||
|
msgid "You can download your GoodReads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener\">Import/Export page</a> of your GoodReads account."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12
|
#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12
|
||||||
#: bookwyrm/templates/login.html:51
|
#: bookwyrm/templates/login.html:51
|
||||||
msgid "Create an Account"
|
msgid "Create an Account"
|
||||||
|
@ -1476,8 +1488,23 @@ msgstr ""
|
||||||
msgid "Discard"
|
msgid "Discard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:4
|
||||||
|
msgid "Delete this list?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:7
|
||||||
|
msgid "This action cannot be un-done"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:15
|
||||||
|
#: bookwyrm/templates/settings/announcement.html:20
|
||||||
|
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15
|
||||||
|
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
|
||||||
|
msgid "Delete"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/lists/edit_form.html:5
|
#: bookwyrm/templates/lists/edit_form.html:5
|
||||||
#: bookwyrm/templates/lists/list_layout.html:16
|
#: bookwyrm/templates/lists/layout.html:16
|
||||||
msgid "Edit List"
|
msgid "Edit List"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1512,6 +1539,10 @@ msgstr ""
|
||||||
msgid "Anyone can add books to this list"
|
msgid "Anyone can add books to this list"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/form.html:49
|
||||||
|
msgid "Delete list"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/lists/list.html:20
|
#: bookwyrm/templates/lists/list.html:20
|
||||||
msgid "You successfully suggested a book for this list!"
|
msgid "You successfully suggested a book for this list!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1901,6 +1932,7 @@ msgid "Account"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/preferences/layout.html:15
|
#: bookwyrm/templates/preferences/layout.html:15
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:7
|
||||||
msgid "Profile"
|
msgid "Profile"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2021,12 +2053,6 @@ msgstr ""
|
||||||
msgid "Edit Announcement"
|
msgid "Edit Announcement"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/announcement.html:20
|
|
||||||
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15
|
|
||||||
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
|
|
||||||
msgid "Delete"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/announcement.html:35
|
#: bookwyrm/templates/settings/announcement.html:35
|
||||||
msgid "Visible:"
|
msgid "Visible:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2077,6 +2103,7 @@ msgstr ""
|
||||||
#: bookwyrm/templates/settings/manage_invite_requests.html:44
|
#: bookwyrm/templates/settings/manage_invite_requests.html:44
|
||||||
#: bookwyrm/templates/settings/status_filter.html:5
|
#: bookwyrm/templates/settings/status_filter.html:5
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:34
|
#: bookwyrm/templates/user_admin/user_admin.html:34
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:20
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2114,7 +2141,7 @@ msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:37
|
#: bookwyrm/templates/settings/edit_server.html:37
|
||||||
#: bookwyrm/templates/settings/federated_server.html:31
|
#: bookwyrm/templates/settings/federated_server.html:31
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:34
|
#: bookwyrm/templates/user_admin/user_info.html:125
|
||||||
msgid "Status:"
|
msgid "Status:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2129,13 +2156,13 @@ msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:48
|
#: bookwyrm/templates/settings/edit_server.html:48
|
||||||
#: bookwyrm/templates/settings/federated_server.html:23
|
#: bookwyrm/templates/settings/federated_server.html:23
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:26
|
#: bookwyrm/templates/user_admin/user_info.html:117
|
||||||
msgid "Software:"
|
msgid "Software:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:55
|
#: bookwyrm/templates/settings/edit_server.html:55
|
||||||
#: bookwyrm/templates/settings/federated_server.html:27
|
#: bookwyrm/templates/settings/federated_server.html:27
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:30
|
#: bookwyrm/templates/user_admin/user_info.html:121
|
||||||
msgid "Version:"
|
msgid "Version:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2162,6 +2189,7 @@ msgid "View all"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/federated_server.html:50
|
#: bookwyrm/templates/settings/federated_server.html:50
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:59
|
||||||
msgid "Reports:"
|
msgid "Reports:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2178,7 +2206,7 @@ msgid "Blocked by us:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/federated_server.html:82
|
#: bookwyrm/templates/settings/federated_server.html:82
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:39
|
#: bookwyrm/templates/user_admin/user_info.html:130
|
||||||
msgid "Notes"
|
msgid "Notes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -3100,7 +3128,7 @@ msgstr[1] ""
|
||||||
msgid "No followers you follow"
|
msgid "No followers you follow"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user.html:9
|
#: bookwyrm/templates/user_admin/user.html:8
|
||||||
msgid "Back to users"
|
msgid "Back to users"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -3127,31 +3155,69 @@ msgid "Remote instance"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:47
|
#: bookwyrm/templates/user_admin/user_admin.html:47
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:24
|
||||||
msgid "Active"
|
msgid "Active"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:47
|
#: bookwyrm/templates/user_admin/user_admin.html:47
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:28
|
||||||
msgid "Inactive"
|
msgid "Inactive"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:52
|
#: bookwyrm/templates/user_admin/user_admin.html:52
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:49
|
#: bookwyrm/templates/user_admin/user_info.html:140
|
||||||
msgid "Not set"
|
msgid "Not set"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:5
|
#: bookwyrm/templates/user_admin/user_info.html:16
|
||||||
msgid "User details"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:14
|
|
||||||
msgid "View user profile"
|
msgid "View user profile"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:20
|
#: bookwyrm/templates/user_admin/user_info.html:36
|
||||||
|
msgid "Local"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:38
|
||||||
|
msgid "Remote"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:47
|
||||||
|
msgid "User details"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:52
|
||||||
|
msgid "Email:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:64
|
||||||
|
msgid "(View reports)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:72
|
||||||
|
msgid "Blocked by count:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:77
|
||||||
|
msgid "Last active date:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:82
|
||||||
|
msgid "Manually approved followers:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:87
|
||||||
|
msgid "Discoverable:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:93
|
||||||
|
msgid "Deactivation reason:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:111
|
||||||
msgid "Instance details"
|
msgid "Instance details"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:46
|
#: bookwyrm/templates/user_admin/user_info.html:137
|
||||||
msgid "View instance"
|
msgid "View instance"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -3180,14 +3246,14 @@ msgstr ""
|
||||||
msgid "%(title)s: %(subtitle)s"
|
msgid "%(title)s: %(subtitle)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/views/authentication.py:69
|
|
||||||
msgid "Username or password are incorrect"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: bookwyrm/views/import_data.py:67
|
#: bookwyrm/views/import_data.py:67
|
||||||
msgid "Not a valid csv file"
|
msgid "Not a valid csv file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/views/login.py:70
|
||||||
|
msgid "Username or password are incorrect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/views/password.py:32
|
#: bookwyrm/views/password.py:32
|
||||||
msgid "No user with that email address was found."
|
msgid "No user with that email address was found."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
Binary file not shown.
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 0.0.1\n"
|
"Project-Id-Version: 0.0.1\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-09-05 23:09+0000\n"
|
"POT-Creation-Date: 2021-09-08 15:57+0000\n"
|
||||||
"PO-Revision-Date: 2021-03-19 11:49+0800\n"
|
"PO-Revision-Date: 2021-03-19 11:49+0800\n"
|
||||||
"Last-Translator: Reese Porter <reesedporter@gmail.com>\n"
|
"Last-Translator: Reese Porter <reesedporter@gmail.com>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -92,45 +92,45 @@ msgstr "nombre de usuario"
|
||||||
msgid "A user with that username already exists."
|
msgid "A user with that username already exists."
|
||||||
msgstr "Ya existe un usuario con ese nombre."
|
msgstr "Ya existe un usuario con ese nombre."
|
||||||
|
|
||||||
#: bookwyrm/settings.py:124
|
#: bookwyrm/settings.py:113
|
||||||
msgid "Home Timeline"
|
msgid "Home Timeline"
|
||||||
msgstr "Línea temporal de hogar"
|
msgstr "Línea temporal de hogar"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:124
|
#: bookwyrm/settings.py:113
|
||||||
msgid "Home"
|
msgid "Home"
|
||||||
msgstr "Hogar"
|
msgstr "Hogar"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:125
|
#: bookwyrm/settings.py:114
|
||||||
msgid "Books Timeline"
|
msgid "Books Timeline"
|
||||||
msgstr "Línea temporal de libros"
|
msgstr "Línea temporal de libros"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:125 bookwyrm/templates/search/layout.html:21
|
#: bookwyrm/settings.py:114 bookwyrm/templates/search/layout.html:21
|
||||||
#: bookwyrm/templates/search/layout.html:42
|
#: bookwyrm/templates/search/layout.html:42
|
||||||
#: bookwyrm/templates/user/layout.html:81
|
#: bookwyrm/templates/user/layout.html:81
|
||||||
msgid "Books"
|
msgid "Books"
|
||||||
msgstr "Libros"
|
msgstr "Libros"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:171
|
#: bookwyrm/settings.py:160
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "Inglés"
|
msgstr "Inglés"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:172
|
#: bookwyrm/settings.py:161
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr "Aléman"
|
msgstr "Aléman"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:173
|
#: bookwyrm/settings.py:162
|
||||||
msgid "Spanish"
|
msgid "Spanish"
|
||||||
msgstr "Español"
|
msgstr "Español"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:174
|
#: bookwyrm/settings.py:163
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr "Francés"
|
msgstr "Francés"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:175
|
#: bookwyrm/settings.py:164
|
||||||
msgid "Simplified Chinese"
|
msgid "Simplified Chinese"
|
||||||
msgstr "Chino simplificado"
|
msgstr "Chino simplificado"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:176
|
#: bookwyrm/settings.py:165
|
||||||
msgid "Traditional Chinese"
|
msgid "Traditional Chinese"
|
||||||
msgstr "Chino tradicional"
|
msgstr "Chino tradicional"
|
||||||
|
|
||||||
|
@ -279,7 +279,7 @@ msgstr "Clave Goodreads:"
|
||||||
#: bookwyrm/templates/book/edit_book.html:328
|
#: bookwyrm/templates/book/edit_book.html:328
|
||||||
#: bookwyrm/templates/book/readthrough.html:76
|
#: bookwyrm/templates/book/readthrough.html:76
|
||||||
#: bookwyrm/templates/lists/bookmark_button.html:15
|
#: bookwyrm/templates/lists/bookmark_button.html:15
|
||||||
#: bookwyrm/templates/lists/form.html:42
|
#: bookwyrm/templates/lists/form.html:44
|
||||||
#: bookwyrm/templates/preferences/edit_user.html:78
|
#: bookwyrm/templates/preferences/edit_user.html:78
|
||||||
#: bookwyrm/templates/settings/announcement_form.html:69
|
#: bookwyrm/templates/settings/announcement_form.html:69
|
||||||
#: bookwyrm/templates/settings/edit_server.html:68
|
#: bookwyrm/templates/settings/edit_server.html:68
|
||||||
|
@ -296,6 +296,7 @@ msgstr "Guardar"
|
||||||
#: bookwyrm/templates/book/cover_modal.html:32
|
#: bookwyrm/templates/book/cover_modal.html:32
|
||||||
#: bookwyrm/templates/book/edit_book.html:329
|
#: bookwyrm/templates/book/edit_book.html:329
|
||||||
#: bookwyrm/templates/book/readthrough.html:77
|
#: bookwyrm/templates/book/readthrough.html:77
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:17
|
||||||
#: bookwyrm/templates/moderation/report_modal.html:34
|
#: bookwyrm/templates/moderation/report_modal.html:34
|
||||||
#: bookwyrm/templates/settings/federated_server.html:99
|
#: bookwyrm/templates/settings/federated_server.html:99
|
||||||
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
|
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
|
||||||
|
@ -672,6 +673,7 @@ msgstr "Buscar ediciones"
|
||||||
|
|
||||||
#: bookwyrm/templates/components/inline_form.html:8
|
#: bookwyrm/templates/components/inline_form.html:8
|
||||||
#: bookwyrm/templates/components/modal.html:11
|
#: bookwyrm/templates/components/modal.html:11
|
||||||
|
#: bookwyrm/templates/components/tooltip.html:7
|
||||||
#: bookwyrm/templates/feed/layout.html:71
|
#: bookwyrm/templates/feed/layout.html:71
|
||||||
#: bookwyrm/templates/get_started/layout.html:20
|
#: bookwyrm/templates/get_started/layout.html:20
|
||||||
#: bookwyrm/templates/get_started/layout.html:53
|
#: bookwyrm/templates/get_started/layout.html:53
|
||||||
|
@ -680,6 +682,10 @@ msgstr "Buscar ediciones"
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Cerrar"
|
msgstr "Cerrar"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/components/tooltip.html:3
|
||||||
|
msgid "Help"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8
|
#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8
|
||||||
msgid "Compose status"
|
msgid "Compose status"
|
||||||
msgstr "Componer status"
|
msgstr "Componer status"
|
||||||
|
@ -701,6 +707,7 @@ msgid "Sorry! We couldn't find that code."
|
||||||
msgstr "Sentimos que no pudimos encontrar ese código"
|
msgstr "Sentimos que no pudimos encontrar ese código"
|
||||||
|
|
||||||
#: bookwyrm/templates/confirm_email/confirm_email.html:19
|
#: bookwyrm/templates/confirm_email/confirm_email.html:19
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:100
|
||||||
msgid "Confirmation code:"
|
msgid "Confirmation code:"
|
||||||
msgstr "Código de confirmación:"
|
msgstr "Código de confirmación:"
|
||||||
|
|
||||||
|
@ -1168,119 +1175,124 @@ msgstr "Tus libros de %(year)s"
|
||||||
msgid "%(username)s's %(year)s Books"
|
msgid "%(username)s's %(year)s Books"
|
||||||
msgstr "Los libros de %(username)s para %(year)s"
|
msgstr "Los libros de %(username)s para %(year)s"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9
|
#: bookwyrm/templates/import/import.html:5
|
||||||
|
#: bookwyrm/templates/import/import.html:9
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:57
|
#: bookwyrm/templates/user/shelf/shelf.html:57
|
||||||
msgid "Import Books"
|
msgid "Import Books"
|
||||||
msgstr "Importar libros"
|
msgstr "Importar libros"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:16
|
#: bookwyrm/templates/import/import.html:18
|
||||||
msgid "Data source:"
|
msgid "Data source:"
|
||||||
msgstr "Fuente de datos:"
|
msgstr "Fuente de datos:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:32
|
#: bookwyrm/templates/import/import.html:37
|
||||||
msgid "Data file:"
|
msgid "Data file:"
|
||||||
msgstr "Archivo de datos:"
|
msgstr "Archivo de datos:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:40
|
#: bookwyrm/templates/import/import.html:45
|
||||||
msgid "Include reviews"
|
msgid "Include reviews"
|
||||||
msgstr "Incluir reseñas"
|
msgstr "Incluir reseñas"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:45
|
#: bookwyrm/templates/import/import.html:50
|
||||||
msgid "Privacy setting for imported reviews:"
|
msgid "Privacy setting for imported reviews:"
|
||||||
msgstr "Configuración de privacidad para las reseñas importadas:"
|
msgstr "Configuración de privacidad para las reseñas importadas:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:51
|
#: bookwyrm/templates/import/import.html:56
|
||||||
#: bookwyrm/templates/settings/server_blocklist.html:64
|
#: bookwyrm/templates/settings/server_blocklist.html:64
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "Importar"
|
msgstr "Importar"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:56
|
#: bookwyrm/templates/import/import.html:61
|
||||||
msgid "Recent Imports"
|
msgid "Recent Imports"
|
||||||
msgstr "Importaciones recientes"
|
msgstr "Importaciones recientes"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:58
|
#: bookwyrm/templates/import/import.html:63
|
||||||
msgid "No recent imports"
|
msgid "No recent imports"
|
||||||
msgstr "No hay ninguna importación reciente"
|
msgstr "No hay ninguna importación reciente"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:6
|
#: bookwyrm/templates/import/import_status.html:6
|
||||||
#: bookwyrm/templates/import_status.html:10
|
#: bookwyrm/templates/import/import_status.html:10
|
||||||
msgid "Import Status"
|
msgid "Import Status"
|
||||||
msgstr "Status de importación"
|
msgstr "Status de importación"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:11
|
#: bookwyrm/templates/import/import_status.html:11
|
||||||
msgid "Back to imports"
|
msgid "Back to imports"
|
||||||
msgstr "Volver a las importaciones"
|
msgstr "Volver a las importaciones"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:15
|
#: bookwyrm/templates/import/import_status.html:15
|
||||||
msgid "Import started:"
|
msgid "Import started:"
|
||||||
msgstr "Importación ha empezado:"
|
msgstr "Importación ha empezado:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:20
|
#: bookwyrm/templates/import/import_status.html:20
|
||||||
msgid "Import completed:"
|
msgid "Import completed:"
|
||||||
msgstr "Importación ha terminado:"
|
msgstr "Importación ha terminado:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:24
|
#: bookwyrm/templates/import/import_status.html:24
|
||||||
msgid "TASK FAILED"
|
msgid "TASK FAILED"
|
||||||
msgstr "TAREA FALLÓ"
|
msgstr "TAREA FALLÓ"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:32
|
#: bookwyrm/templates/import/import_status.html:32
|
||||||
msgid "Import still in progress."
|
msgid "Import still in progress."
|
||||||
msgstr "Importación todavia en progreso"
|
msgstr "Importación todavia en progreso"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:34
|
#: bookwyrm/templates/import/import_status.html:34
|
||||||
msgid "(Hit reload to update!)"
|
msgid "(Hit reload to update!)"
|
||||||
msgstr "(¡Refresca para actualizar!)"
|
msgstr "(¡Refresca para actualizar!)"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:41
|
#: bookwyrm/templates/import/import_status.html:41
|
||||||
msgid "Failed to load"
|
msgid "Failed to load"
|
||||||
msgstr "No se pudo cargar"
|
msgstr "No se pudo cargar"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:50
|
#: bookwyrm/templates/import/import_status.html:50
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
|
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
|
||||||
msgstr "Saltar al final de la lista para seleccionar los %(failed_count)s artículos que no se pudieron importar."
|
msgstr "Saltar al final de la lista para seleccionar los %(failed_count)s artículos que no se pudieron importar."
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:62
|
#: bookwyrm/templates/import/import_status.html:62
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Line %(index)s: <strong>%(title)s</strong> by %(author)s"
|
msgid "Line %(index)s: <strong>%(title)s</strong> by %(author)s"
|
||||||
msgstr "Renglón %(index)s: <strong>%(title)s</strong> por %(author)s"
|
msgstr "Renglón %(index)s: <strong>%(title)s</strong> por %(author)s"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:82
|
#: bookwyrm/templates/import/import_status.html:82
|
||||||
msgid "Select all"
|
msgid "Select all"
|
||||||
msgstr "Seleccionar todo"
|
msgstr "Seleccionar todo"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:85
|
#: bookwyrm/templates/import/import_status.html:85
|
||||||
msgid "Retry items"
|
msgid "Retry items"
|
||||||
msgstr "Reintentar ítems"
|
msgstr "Reintentar ítems"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:112
|
#: bookwyrm/templates/import/import_status.html:112
|
||||||
msgid "Successfully imported"
|
msgid "Successfully imported"
|
||||||
msgstr "Importado exitosamente"
|
msgstr "Importado exitosamente"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:114
|
#: bookwyrm/templates/import/import_status.html:114
|
||||||
msgid "Import Progress"
|
msgid "Import Progress"
|
||||||
msgstr "Progreso de importación"
|
msgstr "Progreso de importación"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:119
|
#: bookwyrm/templates/import/import_status.html:119
|
||||||
msgid "Book"
|
msgid "Book"
|
||||||
msgstr "Libro"
|
msgstr "Libro"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:122
|
#: bookwyrm/templates/import/import_status.html:122
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:111
|
#: bookwyrm/templates/user/shelf/shelf.html:111
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:131
|
#: bookwyrm/templates/user/shelf/shelf.html:131
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Título"
|
msgstr "Título"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:125
|
#: bookwyrm/templates/import/import_status.html:125
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:112
|
#: bookwyrm/templates/user/shelf/shelf.html:112
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:134
|
#: bookwyrm/templates/user/shelf/shelf.html:134
|
||||||
msgid "Author"
|
msgid "Author"
|
||||||
msgstr "Autor/Autora"
|
msgstr "Autor/Autora"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:148
|
#: bookwyrm/templates/import/import_status.html:148
|
||||||
msgid "Imported"
|
msgid "Imported"
|
||||||
msgstr "Importado"
|
msgstr "Importado"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/import/tooltip.html:6
|
||||||
|
msgid "You can download your GoodReads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener\">Import/Export page</a> of your GoodReads account."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12
|
#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12
|
||||||
#: bookwyrm/templates/login.html:51
|
#: bookwyrm/templates/login.html:51
|
||||||
msgid "Create an Account"
|
msgid "Create an Account"
|
||||||
|
@ -1476,8 +1488,27 @@ msgstr "Aprobar"
|
||||||
msgid "Discard"
|
msgid "Discard"
|
||||||
msgstr "Desechar"
|
msgstr "Desechar"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:4
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Delete this progress update"
|
||||||
|
msgid "Delete this list?"
|
||||||
|
msgstr "Eliminar esta actualización de progreso"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:7
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "This field cannot be null."
|
||||||
|
msgid "This action cannot be un-done"
|
||||||
|
msgstr "Este campo no puede ser nulo."
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:15
|
||||||
|
#: bookwyrm/templates/settings/announcement.html:20
|
||||||
|
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15
|
||||||
|
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
|
||||||
|
msgid "Delete"
|
||||||
|
msgstr "Eliminar"
|
||||||
|
|
||||||
#: bookwyrm/templates/lists/edit_form.html:5
|
#: bookwyrm/templates/lists/edit_form.html:5
|
||||||
#: bookwyrm/templates/lists/list_layout.html:16
|
#: bookwyrm/templates/lists/layout.html:16
|
||||||
msgid "Edit List"
|
msgid "Edit List"
|
||||||
msgstr "Editar lista"
|
msgstr "Editar lista"
|
||||||
|
|
||||||
|
@ -1512,6 +1543,12 @@ msgstr "Abierto"
|
||||||
msgid "Anyone can add books to this list"
|
msgid "Anyone can add books to this list"
|
||||||
msgstr "Cualquer usuario puede agregar libros a esta lista"
|
msgstr "Cualquer usuario puede agregar libros a esta lista"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/form.html:49
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Delete status"
|
||||||
|
msgid "Delete list"
|
||||||
|
msgstr "Eliminar status"
|
||||||
|
|
||||||
#: bookwyrm/templates/lists/list.html:20
|
#: bookwyrm/templates/lists/list.html:20
|
||||||
msgid "You successfully suggested a book for this list!"
|
msgid "You successfully suggested a book for this list!"
|
||||||
msgstr "¡Has sugerido un libro para esta lista exitosamente!"
|
msgstr "¡Has sugerido un libro para esta lista exitosamente!"
|
||||||
|
@ -1901,6 +1938,7 @@ msgid "Account"
|
||||||
msgstr "Cuenta"
|
msgstr "Cuenta"
|
||||||
|
|
||||||
#: bookwyrm/templates/preferences/layout.html:15
|
#: bookwyrm/templates/preferences/layout.html:15
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:7
|
||||||
msgid "Profile"
|
msgid "Profile"
|
||||||
msgstr "Perfil"
|
msgstr "Perfil"
|
||||||
|
|
||||||
|
@ -2021,12 +2059,6 @@ msgstr "Volver a la lista de servidores"
|
||||||
msgid "Edit Announcement"
|
msgid "Edit Announcement"
|
||||||
msgstr "Editar anuncio"
|
msgstr "Editar anuncio"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/announcement.html:20
|
|
||||||
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15
|
|
||||||
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
|
|
||||||
msgid "Delete"
|
|
||||||
msgstr "Eliminar"
|
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/announcement.html:35
|
#: bookwyrm/templates/settings/announcement.html:35
|
||||||
msgid "Visible:"
|
msgid "Visible:"
|
||||||
msgstr "Visible:"
|
msgstr "Visible:"
|
||||||
|
@ -2077,6 +2109,7 @@ msgstr "Fecha final"
|
||||||
#: bookwyrm/templates/settings/manage_invite_requests.html:44
|
#: bookwyrm/templates/settings/manage_invite_requests.html:44
|
||||||
#: bookwyrm/templates/settings/status_filter.html:5
|
#: bookwyrm/templates/settings/status_filter.html:5
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:34
|
#: bookwyrm/templates/user_admin/user_admin.html:34
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:20
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Status"
|
msgstr "Status"
|
||||||
|
|
||||||
|
@ -2114,7 +2147,7 @@ msgstr "Instancia:"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:37
|
#: bookwyrm/templates/settings/edit_server.html:37
|
||||||
#: bookwyrm/templates/settings/federated_server.html:31
|
#: bookwyrm/templates/settings/federated_server.html:31
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:34
|
#: bookwyrm/templates/user_admin/user_info.html:125
|
||||||
msgid "Status:"
|
msgid "Status:"
|
||||||
msgstr "Status:"
|
msgstr "Status:"
|
||||||
|
|
||||||
|
@ -2129,13 +2162,13 @@ msgstr "Bloqueado"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:48
|
#: bookwyrm/templates/settings/edit_server.html:48
|
||||||
#: bookwyrm/templates/settings/federated_server.html:23
|
#: bookwyrm/templates/settings/federated_server.html:23
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:26
|
#: bookwyrm/templates/user_admin/user_info.html:117
|
||||||
msgid "Software:"
|
msgid "Software:"
|
||||||
msgstr "Software:"
|
msgstr "Software:"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:55
|
#: bookwyrm/templates/settings/edit_server.html:55
|
||||||
#: bookwyrm/templates/settings/federated_server.html:27
|
#: bookwyrm/templates/settings/federated_server.html:27
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:30
|
#: bookwyrm/templates/user_admin/user_info.html:121
|
||||||
msgid "Version:"
|
msgid "Version:"
|
||||||
msgstr "Versión:"
|
msgstr "Versión:"
|
||||||
|
|
||||||
|
@ -2162,6 +2195,7 @@ msgid "View all"
|
||||||
msgstr "Ver todos"
|
msgstr "Ver todos"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/federated_server.html:50
|
#: bookwyrm/templates/settings/federated_server.html:50
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:59
|
||||||
msgid "Reports:"
|
msgid "Reports:"
|
||||||
msgstr "Informes:"
|
msgstr "Informes:"
|
||||||
|
|
||||||
|
@ -2178,7 +2212,7 @@ msgid "Blocked by us:"
|
||||||
msgstr "Bloqueado por nosotros:"
|
msgstr "Bloqueado por nosotros:"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/federated_server.html:82
|
#: bookwyrm/templates/settings/federated_server.html:82
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:39
|
#: bookwyrm/templates/user_admin/user_info.html:130
|
||||||
msgid "Notes"
|
msgid "Notes"
|
||||||
msgstr "Notas"
|
msgstr "Notas"
|
||||||
|
|
||||||
|
@ -3108,7 +3142,7 @@ msgstr[1] "%(mutuals_display)s seguidores que sigues"
|
||||||
msgid "No followers you follow"
|
msgid "No followers you follow"
|
||||||
msgstr "Ningún seguidor que tu sigues"
|
msgstr "Ningún seguidor que tu sigues"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user.html:9
|
#: bookwyrm/templates/user_admin/user.html:8
|
||||||
msgid "Back to users"
|
msgid "Back to users"
|
||||||
msgstr "Volver a usuarios"
|
msgstr "Volver a usuarios"
|
||||||
|
|
||||||
|
@ -3135,31 +3169,85 @@ msgid "Remote instance"
|
||||||
msgstr "Instancia remota"
|
msgstr "Instancia remota"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:47
|
#: bookwyrm/templates/user_admin/user_admin.html:47
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:24
|
||||||
msgid "Active"
|
msgid "Active"
|
||||||
msgstr "Activ@"
|
msgstr "Activ@"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:47
|
#: bookwyrm/templates/user_admin/user_admin.html:47
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:28
|
||||||
msgid "Inactive"
|
msgid "Inactive"
|
||||||
msgstr "Inactiv@"
|
msgstr "Inactiv@"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:52
|
#: bookwyrm/templates/user_admin/user_admin.html:52
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:49
|
#: bookwyrm/templates/user_admin/user_info.html:140
|
||||||
msgid "Not set"
|
msgid "Not set"
|
||||||
msgstr "No establecido"
|
msgstr "No establecido"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:5
|
#: bookwyrm/templates/user_admin/user_info.html:16
|
||||||
msgid "User details"
|
|
||||||
msgstr "Detalles"
|
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:14
|
|
||||||
msgid "View user profile"
|
msgid "View user profile"
|
||||||
msgstr "Ver perfil de usuario"
|
msgstr "Ver perfil de usuario"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:20
|
#: bookwyrm/templates/user_admin/user_info.html:36
|
||||||
|
msgid "Local"
|
||||||
|
msgstr "Local"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:38
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Remove"
|
||||||
|
msgid "Remote"
|
||||||
|
msgstr "Quitar"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:47
|
||||||
|
msgid "User details"
|
||||||
|
msgstr "Detalles"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:52
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Email"
|
||||||
|
msgid "Email:"
|
||||||
|
msgstr "Correo electronico"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:64
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "View directory"
|
||||||
|
msgid "(View reports)"
|
||||||
|
msgstr "Ver directorio"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:72
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Blocked by us:"
|
||||||
|
msgid "Blocked by count:"
|
||||||
|
msgstr "Bloqueado por nosotros:"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:77
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "last active"
|
||||||
|
msgid "Last active date:"
|
||||||
|
msgstr "actividad reciente"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:82
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Manually approve followers:"
|
||||||
|
msgid "Manually approved followers:"
|
||||||
|
msgstr "Aprobar seguidores a mano:"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:87
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Discover"
|
||||||
|
msgid "Discoverable:"
|
||||||
|
msgstr "Descubrir"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:93
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Deactivate user"
|
||||||
|
msgid "Deactivation reason:"
|
||||||
|
msgstr "Desactivar usuario"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:111
|
||||||
msgid "Instance details"
|
msgid "Instance details"
|
||||||
msgstr "Detalles de instancia"
|
msgstr "Detalles de instancia"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:46
|
#: bookwyrm/templates/user_admin/user_info.html:137
|
||||||
msgid "View instance"
|
msgid "View instance"
|
||||||
msgstr "Ver instancia"
|
msgstr "Ver instancia"
|
||||||
|
|
||||||
|
@ -3188,14 +3276,14 @@ msgstr "Archivo excede el tamaño máximo: 10MB"
|
||||||
msgid "%(title)s: %(subtitle)s"
|
msgid "%(title)s: %(subtitle)s"
|
||||||
msgstr "%(title)s: %(subtitle)s"
|
msgstr "%(title)s: %(subtitle)s"
|
||||||
|
|
||||||
#: bookwyrm/views/authentication.py:69
|
|
||||||
msgid "Username or password are incorrect"
|
|
||||||
msgstr "Nombre de usuario o contraseña es incorrecta"
|
|
||||||
|
|
||||||
#: bookwyrm/views/import_data.py:67
|
#: bookwyrm/views/import_data.py:67
|
||||||
msgid "Not a valid csv file"
|
msgid "Not a valid csv file"
|
||||||
msgstr "No un archivo csv válido"
|
msgstr "No un archivo csv válido"
|
||||||
|
|
||||||
|
#: bookwyrm/views/login.py:70
|
||||||
|
msgid "Username or password are incorrect"
|
||||||
|
msgstr "Nombre de usuario o contraseña es incorrecta"
|
||||||
|
|
||||||
#: bookwyrm/views/password.py:32
|
#: bookwyrm/views/password.py:32
|
||||||
msgid "No user with that email address was found."
|
msgid "No user with that email address was found."
|
||||||
msgstr "No se pudo encontrar un usuario con esa dirección de correo electrónico."
|
msgstr "No se pudo encontrar un usuario con esa dirección de correo electrónico."
|
||||||
|
@ -3222,9 +3310,6 @@ msgstr "Actualizaciones de status de {obj.display_name}"
|
||||||
#~ msgid "Federated Timeline"
|
#~ msgid "Federated Timeline"
|
||||||
#~ msgstr "Línea temporal federalizado"
|
#~ msgstr "Línea temporal federalizado"
|
||||||
|
|
||||||
#~ msgid "Local"
|
|
||||||
#~ msgstr "Local"
|
|
||||||
|
|
||||||
#~ msgid "Federated Servers"
|
#~ msgid "Federated Servers"
|
||||||
#~ msgstr "Servidores federalizados"
|
#~ msgstr "Servidores federalizados"
|
||||||
|
|
||||||
|
@ -3348,9 +3433,6 @@ msgstr "Actualizaciones de status de {obj.display_name}"
|
||||||
#~ msgid "Value %(value)r is not a valid choice."
|
#~ msgid "Value %(value)r is not a valid choice."
|
||||||
#~ msgstr "El valor %(value)s no es una opción válida."
|
#~ msgstr "El valor %(value)s no es una opción válida."
|
||||||
|
|
||||||
#~ msgid "This field cannot be null."
|
|
||||||
#~ msgstr "Este campo no puede ser nulo."
|
|
||||||
|
|
||||||
#~ msgid "This field cannot be blank."
|
#~ msgid "This field cannot be blank."
|
||||||
#~ msgstr "Este campo no puede ser vacio."
|
#~ msgstr "Este campo no puede ser vacio."
|
||||||
|
|
||||||
|
@ -4128,9 +4210,6 @@ msgstr "Actualizaciones de status de {obj.display_name}"
|
||||||
#~ msgid "Books tagged \"%(tag.name)s\""
|
#~ msgid "Books tagged \"%(tag.name)s\""
|
||||||
#~ msgstr "Libros etiquetados con \"%(tag.name)s\""
|
#~ msgstr "Libros etiquetados con \"%(tag.name)s\""
|
||||||
|
|
||||||
#~ msgid "Deactivate user"
|
|
||||||
#~ msgstr "Desactivar usuario"
|
|
||||||
|
|
||||||
#~ msgid "Reactivate user"
|
#~ msgid "Reactivate user"
|
||||||
#~ msgstr "Reactivar usuario"
|
#~ msgstr "Reactivar usuario"
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 0.1.1\n"
|
"Project-Id-Version: 0.1.1\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-09-05 23:09+0000\n"
|
"POT-Creation-Date: 2021-09-08 15:57+0000\n"
|
||||||
"PO-Revision-Date: 2021-04-05 12:44+0100\n"
|
"PO-Revision-Date: 2021-04-05 12:44+0100\n"
|
||||||
"Last-Translator: Fabien Basmaison <contact@arkhi.org>\n"
|
"Last-Translator: Fabien Basmaison <contact@arkhi.org>\n"
|
||||||
"Language-Team: Mouse Reeve <LL@li.org>\n"
|
"Language-Team: Mouse Reeve <LL@li.org>\n"
|
||||||
|
@ -92,47 +92,47 @@ msgstr "nom du compte :"
|
||||||
msgid "A user with that username already exists."
|
msgid "A user with that username already exists."
|
||||||
msgstr "Ce nom est déjà associé à un compte."
|
msgstr "Ce nom est déjà associé à un compte."
|
||||||
|
|
||||||
#: bookwyrm/settings.py:124
|
#: bookwyrm/settings.py:113
|
||||||
msgid "Home Timeline"
|
msgid "Home Timeline"
|
||||||
msgstr "Mon fil d’actualité"
|
msgstr "Mon fil d’actualité"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:124
|
#: bookwyrm/settings.py:113
|
||||||
msgid "Home"
|
msgid "Home"
|
||||||
msgstr "Accueil"
|
msgstr "Accueil"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:125
|
#: bookwyrm/settings.py:114
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Book Title"
|
#| msgid "Book Title"
|
||||||
msgid "Books Timeline"
|
msgid "Books Timeline"
|
||||||
msgstr "Titre du livre"
|
msgstr "Titre du livre"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:125 bookwyrm/templates/search/layout.html:21
|
#: bookwyrm/settings.py:114 bookwyrm/templates/search/layout.html:21
|
||||||
#: bookwyrm/templates/search/layout.html:42
|
#: bookwyrm/templates/search/layout.html:42
|
||||||
#: bookwyrm/templates/user/layout.html:81
|
#: bookwyrm/templates/user/layout.html:81
|
||||||
msgid "Books"
|
msgid "Books"
|
||||||
msgstr "Livres"
|
msgstr "Livres"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:171
|
#: bookwyrm/settings.py:160
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "English"
|
msgstr "English"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:172
|
#: bookwyrm/settings.py:161
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr "Deutsch"
|
msgstr "Deutsch"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:173
|
#: bookwyrm/settings.py:162
|
||||||
msgid "Spanish"
|
msgid "Spanish"
|
||||||
msgstr "Español"
|
msgstr "Español"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:174
|
#: bookwyrm/settings.py:163
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr "Français"
|
msgstr "Français"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:175
|
#: bookwyrm/settings.py:164
|
||||||
msgid "Simplified Chinese"
|
msgid "Simplified Chinese"
|
||||||
msgstr "简化字"
|
msgstr "简化字"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:176
|
#: bookwyrm/settings.py:165
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Additional info:"
|
#| msgid "Additional info:"
|
||||||
msgid "Traditional Chinese"
|
msgid "Traditional Chinese"
|
||||||
|
@ -283,7 +283,7 @@ msgstr "Clé Goodreads :"
|
||||||
#: bookwyrm/templates/book/edit_book.html:328
|
#: bookwyrm/templates/book/edit_book.html:328
|
||||||
#: bookwyrm/templates/book/readthrough.html:76
|
#: bookwyrm/templates/book/readthrough.html:76
|
||||||
#: bookwyrm/templates/lists/bookmark_button.html:15
|
#: bookwyrm/templates/lists/bookmark_button.html:15
|
||||||
#: bookwyrm/templates/lists/form.html:42
|
#: bookwyrm/templates/lists/form.html:44
|
||||||
#: bookwyrm/templates/preferences/edit_user.html:78
|
#: bookwyrm/templates/preferences/edit_user.html:78
|
||||||
#: bookwyrm/templates/settings/announcement_form.html:69
|
#: bookwyrm/templates/settings/announcement_form.html:69
|
||||||
#: bookwyrm/templates/settings/edit_server.html:68
|
#: bookwyrm/templates/settings/edit_server.html:68
|
||||||
|
@ -300,6 +300,7 @@ msgstr "Enregistrer"
|
||||||
#: bookwyrm/templates/book/cover_modal.html:32
|
#: bookwyrm/templates/book/cover_modal.html:32
|
||||||
#: bookwyrm/templates/book/edit_book.html:329
|
#: bookwyrm/templates/book/edit_book.html:329
|
||||||
#: bookwyrm/templates/book/readthrough.html:77
|
#: bookwyrm/templates/book/readthrough.html:77
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:17
|
||||||
#: bookwyrm/templates/moderation/report_modal.html:34
|
#: bookwyrm/templates/moderation/report_modal.html:34
|
||||||
#: bookwyrm/templates/settings/federated_server.html:99
|
#: bookwyrm/templates/settings/federated_server.html:99
|
||||||
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
|
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
|
||||||
|
@ -678,6 +679,7 @@ msgstr "Résultats de recherche"
|
||||||
|
|
||||||
#: bookwyrm/templates/components/inline_form.html:8
|
#: bookwyrm/templates/components/inline_form.html:8
|
||||||
#: bookwyrm/templates/components/modal.html:11
|
#: bookwyrm/templates/components/modal.html:11
|
||||||
|
#: bookwyrm/templates/components/tooltip.html:7
|
||||||
#: bookwyrm/templates/feed/layout.html:71
|
#: bookwyrm/templates/feed/layout.html:71
|
||||||
#: bookwyrm/templates/get_started/layout.html:20
|
#: bookwyrm/templates/get_started/layout.html:20
|
||||||
#: bookwyrm/templates/get_started/layout.html:53
|
#: bookwyrm/templates/get_started/layout.html:53
|
||||||
|
@ -686,6 +688,10 @@ msgstr "Résultats de recherche"
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Fermer"
|
msgstr "Fermer"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/components/tooltip.html:3
|
||||||
|
msgid "Help"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8
|
#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8
|
||||||
msgid "Compose status"
|
msgid "Compose status"
|
||||||
msgstr "Rédiger un statut"
|
msgstr "Rédiger un statut"
|
||||||
|
@ -707,6 +713,7 @@ msgid "Sorry! We couldn't find that code."
|
||||||
msgstr "Pardon ! Nous ne reconnaissons pas ce code."
|
msgstr "Pardon ! Nous ne reconnaissons pas ce code."
|
||||||
|
|
||||||
#: bookwyrm/templates/confirm_email/confirm_email.html:19
|
#: bookwyrm/templates/confirm_email/confirm_email.html:19
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:100
|
||||||
msgid "Confirmation code:"
|
msgid "Confirmation code:"
|
||||||
msgstr "Code de confirmation :"
|
msgstr "Code de confirmation :"
|
||||||
|
|
||||||
|
@ -1183,123 +1190,128 @@ msgstr "Vos livres en %(year)s"
|
||||||
msgid "%(username)s's %(year)s Books"
|
msgid "%(username)s's %(year)s Books"
|
||||||
msgstr "Livres de %(username)s en %(year)s"
|
msgstr "Livres de %(username)s en %(year)s"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9
|
#: bookwyrm/templates/import/import.html:5
|
||||||
|
#: bookwyrm/templates/import/import.html:9
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:57
|
#: bookwyrm/templates/user/shelf/shelf.html:57
|
||||||
msgid "Import Books"
|
msgid "Import Books"
|
||||||
msgstr "Importer des livres"
|
msgstr "Importer des livres"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:16
|
#: bookwyrm/templates/import/import.html:18
|
||||||
msgid "Data source:"
|
msgid "Data source:"
|
||||||
msgstr "Source de données :"
|
msgstr "Source de données :"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:32
|
#: bookwyrm/templates/import/import.html:37
|
||||||
msgid "Data file:"
|
msgid "Data file:"
|
||||||
msgstr "Fichier de données :"
|
msgstr "Fichier de données :"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:40
|
#: bookwyrm/templates/import/import.html:45
|
||||||
msgid "Include reviews"
|
msgid "Include reviews"
|
||||||
msgstr "Importer les critiques"
|
msgstr "Importer les critiques"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:45
|
#: bookwyrm/templates/import/import.html:50
|
||||||
msgid "Privacy setting for imported reviews:"
|
msgid "Privacy setting for imported reviews:"
|
||||||
msgstr "Confidentialité des critiques importées :"
|
msgstr "Confidentialité des critiques importées :"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:51
|
#: bookwyrm/templates/import/import.html:56
|
||||||
#: bookwyrm/templates/settings/server_blocklist.html:64
|
#: bookwyrm/templates/settings/server_blocklist.html:64
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "Importer"
|
msgstr "Importer"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:56
|
#: bookwyrm/templates/import/import.html:61
|
||||||
msgid "Recent Imports"
|
msgid "Recent Imports"
|
||||||
msgstr "Importations récentes"
|
msgstr "Importations récentes"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:58
|
#: bookwyrm/templates/import/import.html:63
|
||||||
msgid "No recent imports"
|
msgid "No recent imports"
|
||||||
msgstr "Aucune importation récente"
|
msgstr "Aucune importation récente"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:6
|
#: bookwyrm/templates/import/import_status.html:6
|
||||||
#: bookwyrm/templates/import_status.html:10
|
#: bookwyrm/templates/import/import_status.html:10
|
||||||
msgid "Import Status"
|
msgid "Import Status"
|
||||||
msgstr "Statut de l’importation"
|
msgstr "Statut de l’importation"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:11
|
#: bookwyrm/templates/import/import_status.html:11
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Back to reports"
|
#| msgid "Back to reports"
|
||||||
msgid "Back to imports"
|
msgid "Back to imports"
|
||||||
msgstr "Retour aux signalements"
|
msgstr "Retour aux signalements"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:15
|
#: bookwyrm/templates/import/import_status.html:15
|
||||||
msgid "Import started:"
|
msgid "Import started:"
|
||||||
msgstr "Début de l’importation :"
|
msgstr "Début de l’importation :"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:20
|
#: bookwyrm/templates/import/import_status.html:20
|
||||||
msgid "Import completed:"
|
msgid "Import completed:"
|
||||||
msgstr "Fin de l’importation :"
|
msgstr "Fin de l’importation :"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:24
|
#: bookwyrm/templates/import/import_status.html:24
|
||||||
msgid "TASK FAILED"
|
msgid "TASK FAILED"
|
||||||
msgstr "la tâche a échoué"
|
msgstr "la tâche a échoué"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:32
|
#: bookwyrm/templates/import/import_status.html:32
|
||||||
msgid "Import still in progress."
|
msgid "Import still in progress."
|
||||||
msgstr "L’importation est toujours en cours"
|
msgstr "L’importation est toujours en cours"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:34
|
#: bookwyrm/templates/import/import_status.html:34
|
||||||
msgid "(Hit reload to update!)"
|
msgid "(Hit reload to update!)"
|
||||||
msgstr "(Rechargez la page pour la mettre à jour !)"
|
msgstr "(Rechargez la page pour la mettre à jour !)"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:41
|
#: bookwyrm/templates/import/import_status.html:41
|
||||||
msgid "Failed to load"
|
msgid "Failed to load"
|
||||||
msgstr "Éléments non importés"
|
msgstr "Éléments non importés"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:50
|
#: bookwyrm/templates/import/import_status.html:50
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
|
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
|
||||||
msgstr "Sauter en bas de liste pour sélectionner les %(failed_count)s items n’ayant pu être importés."
|
msgstr "Sauter en bas de liste pour sélectionner les %(failed_count)s items n’ayant pu être importés."
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:62
|
#: bookwyrm/templates/import/import_status.html:62
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Line %(index)s: <strong>%(title)s</strong> by %(author)s"
|
msgid "Line %(index)s: <strong>%(title)s</strong> by %(author)s"
|
||||||
msgstr "Ligne %(index)s : <strong>%(title)s</strong> par %(author)s"
|
msgstr "Ligne %(index)s : <strong>%(title)s</strong> par %(author)s"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:82
|
#: bookwyrm/templates/import/import_status.html:82
|
||||||
msgid "Select all"
|
msgid "Select all"
|
||||||
msgstr "Tout sélectionner"
|
msgstr "Tout sélectionner"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:85
|
#: bookwyrm/templates/import/import_status.html:85
|
||||||
msgid "Retry items"
|
msgid "Retry items"
|
||||||
msgstr "Réessayer l’importation de ces éléments"
|
msgstr "Réessayer l’importation de ces éléments"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:112
|
#: bookwyrm/templates/import/import_status.html:112
|
||||||
msgid "Successfully imported"
|
msgid "Successfully imported"
|
||||||
msgstr "Importation réussie"
|
msgstr "Importation réussie"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:114
|
#: bookwyrm/templates/import/import_status.html:114
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Import still in progress."
|
#| msgid "Import still in progress."
|
||||||
msgid "Import Progress"
|
msgid "Import Progress"
|
||||||
msgstr "L’importation est toujours en cours"
|
msgstr "L’importation est toujours en cours"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:119
|
#: bookwyrm/templates/import/import_status.html:119
|
||||||
msgid "Book"
|
msgid "Book"
|
||||||
msgstr "Livre"
|
msgstr "Livre"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:122
|
#: bookwyrm/templates/import/import_status.html:122
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:111
|
#: bookwyrm/templates/user/shelf/shelf.html:111
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:131
|
#: bookwyrm/templates/user/shelf/shelf.html:131
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Titre"
|
msgstr "Titre"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:125
|
#: bookwyrm/templates/import/import_status.html:125
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:112
|
#: bookwyrm/templates/user/shelf/shelf.html:112
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:134
|
#: bookwyrm/templates/user/shelf/shelf.html:134
|
||||||
msgid "Author"
|
msgid "Author"
|
||||||
msgstr "Auteur/autrice"
|
msgstr "Auteur/autrice"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:148
|
#: bookwyrm/templates/import/import_status.html:148
|
||||||
msgid "Imported"
|
msgid "Imported"
|
||||||
msgstr "Importé"
|
msgstr "Importé"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/import/tooltip.html:6
|
||||||
|
msgid "You can download your GoodReads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener\">Import/Export page</a> of your GoodReads account."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12
|
#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12
|
||||||
#: bookwyrm/templates/login.html:51
|
#: bookwyrm/templates/login.html:51
|
||||||
msgid "Create an Account"
|
msgid "Create an Account"
|
||||||
|
@ -1495,8 +1507,27 @@ msgstr "Approuver"
|
||||||
msgid "Discard"
|
msgid "Discard"
|
||||||
msgstr "Rejeter"
|
msgstr "Rejeter"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:4
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Delete this progress update"
|
||||||
|
msgid "Delete this list?"
|
||||||
|
msgstr "Supprimer cette mise à jour"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:7
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "This shelf is empty."
|
||||||
|
msgid "This action cannot be un-done"
|
||||||
|
msgstr "Cette étagère est vide"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:15
|
||||||
|
#: bookwyrm/templates/settings/announcement.html:20
|
||||||
|
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15
|
||||||
|
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
|
||||||
|
msgid "Delete"
|
||||||
|
msgstr "Supprimer"
|
||||||
|
|
||||||
#: bookwyrm/templates/lists/edit_form.html:5
|
#: bookwyrm/templates/lists/edit_form.html:5
|
||||||
#: bookwyrm/templates/lists/list_layout.html:16
|
#: bookwyrm/templates/lists/layout.html:16
|
||||||
msgid "Edit List"
|
msgid "Edit List"
|
||||||
msgstr "Modifier la liste"
|
msgstr "Modifier la liste"
|
||||||
|
|
||||||
|
@ -1531,6 +1562,12 @@ msgstr "Ouverte"
|
||||||
msgid "Anyone can add books to this list"
|
msgid "Anyone can add books to this list"
|
||||||
msgstr "N’importe qui peut suggérer des livres"
|
msgstr "N’importe qui peut suggérer des livres"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/form.html:49
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Delete status"
|
||||||
|
msgid "Delete list"
|
||||||
|
msgstr "Supprimer le statut"
|
||||||
|
|
||||||
#: bookwyrm/templates/lists/list.html:20
|
#: bookwyrm/templates/lists/list.html:20
|
||||||
msgid "You successfully suggested a book for this list!"
|
msgid "You successfully suggested a book for this list!"
|
||||||
msgstr "Vous avez suggéré un livre à cette liste !"
|
msgstr "Vous avez suggéré un livre à cette liste !"
|
||||||
|
@ -1930,6 +1967,7 @@ msgid "Account"
|
||||||
msgstr "Compte"
|
msgstr "Compte"
|
||||||
|
|
||||||
#: bookwyrm/templates/preferences/layout.html:15
|
#: bookwyrm/templates/preferences/layout.html:15
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:7
|
||||||
msgid "Profile"
|
msgid "Profile"
|
||||||
msgstr "Profil"
|
msgstr "Profil"
|
||||||
|
|
||||||
|
@ -2053,12 +2091,6 @@ msgstr "Retour à la liste"
|
||||||
msgid "Edit Announcement"
|
msgid "Edit Announcement"
|
||||||
msgstr "Modifier l’annonce"
|
msgstr "Modifier l’annonce"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/announcement.html:20
|
|
||||||
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15
|
|
||||||
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
|
|
||||||
msgid "Delete"
|
|
||||||
msgstr "Supprimer"
|
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/announcement.html:35
|
#: bookwyrm/templates/settings/announcement.html:35
|
||||||
msgid "Visible:"
|
msgid "Visible:"
|
||||||
msgstr "Visible :"
|
msgstr "Visible :"
|
||||||
|
@ -2109,6 +2141,7 @@ msgstr "Date de fin"
|
||||||
#: bookwyrm/templates/settings/manage_invite_requests.html:44
|
#: bookwyrm/templates/settings/manage_invite_requests.html:44
|
||||||
#: bookwyrm/templates/settings/status_filter.html:5
|
#: bookwyrm/templates/settings/status_filter.html:5
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:34
|
#: bookwyrm/templates/user_admin/user_admin.html:34
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:20
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Statut"
|
msgstr "Statut"
|
||||||
|
|
||||||
|
@ -2146,7 +2179,7 @@ msgstr "Instance :"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:37
|
#: bookwyrm/templates/settings/edit_server.html:37
|
||||||
#: bookwyrm/templates/settings/federated_server.html:31
|
#: bookwyrm/templates/settings/federated_server.html:31
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:34
|
#: bookwyrm/templates/user_admin/user_info.html:125
|
||||||
msgid "Status:"
|
msgid "Status:"
|
||||||
msgstr "Statut :"
|
msgstr "Statut :"
|
||||||
|
|
||||||
|
@ -2161,13 +2194,13 @@ msgstr "Bloqué"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:48
|
#: bookwyrm/templates/settings/edit_server.html:48
|
||||||
#: bookwyrm/templates/settings/federated_server.html:23
|
#: bookwyrm/templates/settings/federated_server.html:23
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:26
|
#: bookwyrm/templates/user_admin/user_info.html:117
|
||||||
msgid "Software:"
|
msgid "Software:"
|
||||||
msgstr "Logiciel :"
|
msgstr "Logiciel :"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:55
|
#: bookwyrm/templates/settings/edit_server.html:55
|
||||||
#: bookwyrm/templates/settings/federated_server.html:27
|
#: bookwyrm/templates/settings/federated_server.html:27
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:30
|
#: bookwyrm/templates/user_admin/user_info.html:121
|
||||||
msgid "Version:"
|
msgid "Version:"
|
||||||
msgstr "Description :"
|
msgstr "Description :"
|
||||||
|
|
||||||
|
@ -2194,6 +2227,7 @@ msgid "View all"
|
||||||
msgstr "Voir tous"
|
msgstr "Voir tous"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/federated_server.html:50
|
#: bookwyrm/templates/settings/federated_server.html:50
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:59
|
||||||
msgid "Reports:"
|
msgid "Reports:"
|
||||||
msgstr "Signalements :"
|
msgstr "Signalements :"
|
||||||
|
|
||||||
|
@ -2210,7 +2244,7 @@ msgid "Blocked by us:"
|
||||||
msgstr "Bloqués par nous :"
|
msgstr "Bloqués par nous :"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/federated_server.html:82
|
#: bookwyrm/templates/settings/federated_server.html:82
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:39
|
#: bookwyrm/templates/user_admin/user_info.html:130
|
||||||
msgid "Notes"
|
msgid "Notes"
|
||||||
msgstr "Remarques"
|
msgstr "Remarques"
|
||||||
|
|
||||||
|
@ -3159,7 +3193,7 @@ msgstr[1] "%(mutuals_display)s abonné(e)s que vous suivez"
|
||||||
msgid "No followers you follow"
|
msgid "No followers you follow"
|
||||||
msgstr "compte que vous suivez"
|
msgstr "compte que vous suivez"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user.html:9
|
#: bookwyrm/templates/user_admin/user.html:8
|
||||||
msgid "Back to users"
|
msgid "Back to users"
|
||||||
msgstr "Retour aux comptes"
|
msgstr "Retour aux comptes"
|
||||||
|
|
||||||
|
@ -3186,31 +3220,85 @@ msgid "Remote instance"
|
||||||
msgstr "Instance distante"
|
msgstr "Instance distante"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:47
|
#: bookwyrm/templates/user_admin/user_admin.html:47
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:24
|
||||||
msgid "Active"
|
msgid "Active"
|
||||||
msgstr "Actif"
|
msgstr "Actif"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:47
|
#: bookwyrm/templates/user_admin/user_admin.html:47
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:28
|
||||||
msgid "Inactive"
|
msgid "Inactive"
|
||||||
msgstr "Inactif"
|
msgstr "Inactif"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:52
|
#: bookwyrm/templates/user_admin/user_admin.html:52
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:49
|
#: bookwyrm/templates/user_admin/user_info.html:140
|
||||||
msgid "Not set"
|
msgid "Not set"
|
||||||
msgstr "Non défini"
|
msgstr "Non défini"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:5
|
#: bookwyrm/templates/user_admin/user_info.html:16
|
||||||
msgid "User details"
|
|
||||||
msgstr "Détails du compte"
|
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:14
|
|
||||||
msgid "View user profile"
|
msgid "View user profile"
|
||||||
msgstr "Voir le profil"
|
msgstr "Voir le profil"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:20
|
#: bookwyrm/templates/user_admin/user_info.html:36
|
||||||
|
msgid "Local"
|
||||||
|
msgstr "Local"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:38
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Remove"
|
||||||
|
msgid "Remote"
|
||||||
|
msgstr "Retirer"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:47
|
||||||
|
msgid "User details"
|
||||||
|
msgstr "Détails du compte"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:52
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Email"
|
||||||
|
msgid "Email:"
|
||||||
|
msgstr "Email"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:64
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Directory"
|
||||||
|
msgid "(View reports)"
|
||||||
|
msgstr "Répertoire"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:72
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Blocked by us:"
|
||||||
|
msgid "Blocked by count:"
|
||||||
|
msgstr "Bloqués par nous :"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:77
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "last active"
|
||||||
|
msgid "Last active date:"
|
||||||
|
msgstr "dernière activité"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:82
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Manually approve followers:"
|
||||||
|
msgid "Manually approved followers:"
|
||||||
|
msgstr "Autoriser les abonnements manuellement :"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:87
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Discard"
|
||||||
|
msgid "Discoverable:"
|
||||||
|
msgstr "Rejeter"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:93
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Deactivate user"
|
||||||
|
msgid "Deactivation reason:"
|
||||||
|
msgstr "Désactiver le compte"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:111
|
||||||
msgid "Instance details"
|
msgid "Instance details"
|
||||||
msgstr "Détails de l’instance"
|
msgstr "Détails de l’instance"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:46
|
#: bookwyrm/templates/user_admin/user_info.html:137
|
||||||
msgid "View instance"
|
msgid "View instance"
|
||||||
msgstr "Voir l’instance"
|
msgstr "Voir l’instance"
|
||||||
|
|
||||||
|
@ -3239,14 +3327,14 @@ msgstr "Ce fichier dépasse la taille limite : 10 Mo"
|
||||||
msgid "%(title)s: %(subtitle)s"
|
msgid "%(title)s: %(subtitle)s"
|
||||||
msgstr "%(title)s (%(subtitle)s)"
|
msgstr "%(title)s (%(subtitle)s)"
|
||||||
|
|
||||||
#: bookwyrm/views/authentication.py:69
|
|
||||||
msgid "Username or password are incorrect"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: bookwyrm/views/import_data.py:67
|
#: bookwyrm/views/import_data.py:67
|
||||||
msgid "Not a valid csv file"
|
msgid "Not a valid csv file"
|
||||||
msgstr "Fichier CSV non valide"
|
msgstr "Fichier CSV non valide"
|
||||||
|
|
||||||
|
#: bookwyrm/views/login.py:70
|
||||||
|
msgid "Username or password are incorrect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/views/password.py:32
|
#: bookwyrm/views/password.py:32
|
||||||
msgid "No user with that email address was found."
|
msgid "No user with that email address was found."
|
||||||
msgstr "Aucun compte avec cette adresse email n’a été trouvé."
|
msgstr "Aucun compte avec cette adresse email n’a été trouvé."
|
||||||
|
@ -3273,9 +3361,6 @@ msgstr ""
|
||||||
#~ msgid "Federated Timeline"
|
#~ msgid "Federated Timeline"
|
||||||
#~ msgstr "Fil d’actualité des instances fédérées"
|
#~ msgstr "Fil d’actualité des instances fédérées"
|
||||||
|
|
||||||
#~ msgid "Local"
|
|
||||||
#~ msgstr "Local"
|
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "BookWyrm users"
|
#~| msgid "BookWyrm users"
|
||||||
#~ msgid "BookWyrm\\"
|
#~ msgid "BookWyrm\\"
|
||||||
|
@ -3331,11 +3416,6 @@ msgstr ""
|
||||||
#~ msgid "Value %(value)r is not a valid choice."
|
#~ msgid "Value %(value)r is not a valid choice."
|
||||||
#~ msgstr "%(value)s n’est pas une remote_id valide."
|
#~ msgstr "%(value)s n’est pas une remote_id valide."
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
#~| msgid "This shelf is empty."
|
|
||||||
#~ msgid "This field cannot be null."
|
|
||||||
#~ msgstr "Cette étagère est vide"
|
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~| msgid "A user with this email already exists."
|
#~| msgid "A user with this email already exists."
|
||||||
#~ msgid "%(model_name)s with this %(field_label)s already exists."
|
#~ msgid "%(model_name)s with this %(field_label)s already exists."
|
||||||
|
@ -3555,9 +3635,6 @@ msgstr ""
|
||||||
#~ msgid "by %(author)s"
|
#~ msgid "by %(author)s"
|
||||||
#~ msgstr "par %(author)s"
|
#~ msgstr "par %(author)s"
|
||||||
|
|
||||||
#~ msgid "Deactivate user"
|
|
||||||
#~ msgstr "Désactiver le compte"
|
|
||||||
|
|
||||||
#~ msgid "Reactivate user"
|
#~ msgid "Reactivate user"
|
||||||
#~ msgstr "Réactiver le compte"
|
#~ msgstr "Réactiver le compte"
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 0.1.1\n"
|
"Project-Id-Version: 0.1.1\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-09-05 23:09+0000\n"
|
"POT-Creation-Date: 2021-09-08 15:57+0000\n"
|
||||||
"PO-Revision-Date: 2021-03-20 00:56+0000\n"
|
"PO-Revision-Date: 2021-03-20 00:56+0000\n"
|
||||||
"Last-Translator: Kana <gudzpoz@live.com>\n"
|
"Last-Translator: Kana <gudzpoz@live.com>\n"
|
||||||
"Language-Team: Mouse Reeve <LL@li.org>\n"
|
"Language-Team: Mouse Reeve <LL@li.org>\n"
|
||||||
|
@ -92,45 +92,45 @@ msgstr "用户名"
|
||||||
msgid "A user with that username already exists."
|
msgid "A user with that username already exists."
|
||||||
msgstr "已经存在使用该用户名的用户。"
|
msgstr "已经存在使用该用户名的用户。"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:124
|
#: bookwyrm/settings.py:113
|
||||||
msgid "Home Timeline"
|
msgid "Home Timeline"
|
||||||
msgstr "主页时间线"
|
msgstr "主页时间线"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:124
|
#: bookwyrm/settings.py:113
|
||||||
msgid "Home"
|
msgid "Home"
|
||||||
msgstr "主页"
|
msgstr "主页"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:125
|
#: bookwyrm/settings.py:114
|
||||||
msgid "Books Timeline"
|
msgid "Books Timeline"
|
||||||
msgstr "书目时间线"
|
msgstr "书目时间线"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:125 bookwyrm/templates/search/layout.html:21
|
#: bookwyrm/settings.py:114 bookwyrm/templates/search/layout.html:21
|
||||||
#: bookwyrm/templates/search/layout.html:42
|
#: bookwyrm/templates/search/layout.html:42
|
||||||
#: bookwyrm/templates/user/layout.html:81
|
#: bookwyrm/templates/user/layout.html:81
|
||||||
msgid "Books"
|
msgid "Books"
|
||||||
msgstr "书目"
|
msgstr "书目"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:171
|
#: bookwyrm/settings.py:160
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "English(英语)"
|
msgstr "English(英语)"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:172
|
#: bookwyrm/settings.py:161
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr "Deutsch(德语)"
|
msgstr "Deutsch(德语)"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:173
|
#: bookwyrm/settings.py:162
|
||||||
msgid "Spanish"
|
msgid "Spanish"
|
||||||
msgstr "Español(西班牙语)"
|
msgstr "Español(西班牙语)"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:174
|
#: bookwyrm/settings.py:163
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr "Français(法语)"
|
msgstr "Français(法语)"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:175
|
#: bookwyrm/settings.py:164
|
||||||
msgid "Simplified Chinese"
|
msgid "Simplified Chinese"
|
||||||
msgstr "简体中文"
|
msgstr "简体中文"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:176
|
#: bookwyrm/settings.py:165
|
||||||
msgid "Traditional Chinese"
|
msgid "Traditional Chinese"
|
||||||
msgstr "繁體中文(繁体中文)"
|
msgstr "繁體中文(繁体中文)"
|
||||||
|
|
||||||
|
@ -279,7 +279,7 @@ msgstr "Goodreads key:"
|
||||||
#: bookwyrm/templates/book/edit_book.html:328
|
#: bookwyrm/templates/book/edit_book.html:328
|
||||||
#: bookwyrm/templates/book/readthrough.html:76
|
#: bookwyrm/templates/book/readthrough.html:76
|
||||||
#: bookwyrm/templates/lists/bookmark_button.html:15
|
#: bookwyrm/templates/lists/bookmark_button.html:15
|
||||||
#: bookwyrm/templates/lists/form.html:42
|
#: bookwyrm/templates/lists/form.html:44
|
||||||
#: bookwyrm/templates/preferences/edit_user.html:78
|
#: bookwyrm/templates/preferences/edit_user.html:78
|
||||||
#: bookwyrm/templates/settings/announcement_form.html:69
|
#: bookwyrm/templates/settings/announcement_form.html:69
|
||||||
#: bookwyrm/templates/settings/edit_server.html:68
|
#: bookwyrm/templates/settings/edit_server.html:68
|
||||||
|
@ -296,6 +296,7 @@ msgstr "保存"
|
||||||
#: bookwyrm/templates/book/cover_modal.html:32
|
#: bookwyrm/templates/book/cover_modal.html:32
|
||||||
#: bookwyrm/templates/book/edit_book.html:329
|
#: bookwyrm/templates/book/edit_book.html:329
|
||||||
#: bookwyrm/templates/book/readthrough.html:77
|
#: bookwyrm/templates/book/readthrough.html:77
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:17
|
||||||
#: bookwyrm/templates/moderation/report_modal.html:34
|
#: bookwyrm/templates/moderation/report_modal.html:34
|
||||||
#: bookwyrm/templates/settings/federated_server.html:99
|
#: bookwyrm/templates/settings/federated_server.html:99
|
||||||
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
|
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
|
||||||
|
@ -673,6 +674,7 @@ msgstr "搜索结果"
|
||||||
|
|
||||||
#: bookwyrm/templates/components/inline_form.html:8
|
#: bookwyrm/templates/components/inline_form.html:8
|
||||||
#: bookwyrm/templates/components/modal.html:11
|
#: bookwyrm/templates/components/modal.html:11
|
||||||
|
#: bookwyrm/templates/components/tooltip.html:7
|
||||||
#: bookwyrm/templates/feed/layout.html:71
|
#: bookwyrm/templates/feed/layout.html:71
|
||||||
#: bookwyrm/templates/get_started/layout.html:20
|
#: bookwyrm/templates/get_started/layout.html:20
|
||||||
#: bookwyrm/templates/get_started/layout.html:53
|
#: bookwyrm/templates/get_started/layout.html:53
|
||||||
|
@ -681,6 +683,10 @@ msgstr "搜索结果"
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "关闭"
|
msgstr "关闭"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/components/tooltip.html:3
|
||||||
|
msgid "Help"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8
|
#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8
|
||||||
msgid "Compose status"
|
msgid "Compose status"
|
||||||
msgstr "撰写状态"
|
msgstr "撰写状态"
|
||||||
|
@ -702,6 +708,7 @@ msgid "Sorry! We couldn't find that code."
|
||||||
msgstr "抱歉!我们无法找到该代码。"
|
msgstr "抱歉!我们无法找到该代码。"
|
||||||
|
|
||||||
#: bookwyrm/templates/confirm_email/confirm_email.html:19
|
#: bookwyrm/templates/confirm_email/confirm_email.html:19
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:100
|
||||||
msgid "Confirmation code:"
|
msgid "Confirmation code:"
|
||||||
msgstr "确认代码:"
|
msgstr "确认代码:"
|
||||||
|
|
||||||
|
@ -1169,119 +1176,124 @@ msgstr "你 %(year)s 的书目"
|
||||||
msgid "%(username)s's %(year)s Books"
|
msgid "%(username)s's %(year)s Books"
|
||||||
msgstr "%(username)s 在 %(year)s 的书目"
|
msgstr "%(username)s 在 %(year)s 的书目"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9
|
#: bookwyrm/templates/import/import.html:5
|
||||||
|
#: bookwyrm/templates/import/import.html:9
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:57
|
#: bookwyrm/templates/user/shelf/shelf.html:57
|
||||||
msgid "Import Books"
|
msgid "Import Books"
|
||||||
msgstr "导入书目"
|
msgstr "导入书目"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:16
|
#: bookwyrm/templates/import/import.html:18
|
||||||
msgid "Data source:"
|
msgid "Data source:"
|
||||||
msgstr "数据来源:"
|
msgstr "数据来源:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:32
|
#: bookwyrm/templates/import/import.html:37
|
||||||
msgid "Data file:"
|
msgid "Data file:"
|
||||||
msgstr "数据文件:"
|
msgstr "数据文件:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:40
|
#: bookwyrm/templates/import/import.html:45
|
||||||
msgid "Include reviews"
|
msgid "Include reviews"
|
||||||
msgstr "纳入书评"
|
msgstr "纳入书评"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:45
|
#: bookwyrm/templates/import/import.html:50
|
||||||
msgid "Privacy setting for imported reviews:"
|
msgid "Privacy setting for imported reviews:"
|
||||||
msgstr "导入书评的隐私设定"
|
msgstr "导入书评的隐私设定"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:51
|
#: bookwyrm/templates/import/import.html:56
|
||||||
#: bookwyrm/templates/settings/server_blocklist.html:64
|
#: bookwyrm/templates/settings/server_blocklist.html:64
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "导入"
|
msgstr "导入"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:56
|
#: bookwyrm/templates/import/import.html:61
|
||||||
msgid "Recent Imports"
|
msgid "Recent Imports"
|
||||||
msgstr "最近的导入"
|
msgstr "最近的导入"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:58
|
#: bookwyrm/templates/import/import.html:63
|
||||||
msgid "No recent imports"
|
msgid "No recent imports"
|
||||||
msgstr "无最近的导入"
|
msgstr "无最近的导入"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:6
|
#: bookwyrm/templates/import/import_status.html:6
|
||||||
#: bookwyrm/templates/import_status.html:10
|
#: bookwyrm/templates/import/import_status.html:10
|
||||||
msgid "Import Status"
|
msgid "Import Status"
|
||||||
msgstr "导入状态"
|
msgstr "导入状态"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:11
|
#: bookwyrm/templates/import/import_status.html:11
|
||||||
msgid "Back to imports"
|
msgid "Back to imports"
|
||||||
msgstr "回到导入"
|
msgstr "回到导入"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:15
|
#: bookwyrm/templates/import/import_status.html:15
|
||||||
msgid "Import started:"
|
msgid "Import started:"
|
||||||
msgstr "导入开始:"
|
msgstr "导入开始:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:20
|
#: bookwyrm/templates/import/import_status.html:20
|
||||||
msgid "Import completed:"
|
msgid "Import completed:"
|
||||||
msgstr "导入完成:"
|
msgstr "导入完成:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:24
|
#: bookwyrm/templates/import/import_status.html:24
|
||||||
msgid "TASK FAILED"
|
msgid "TASK FAILED"
|
||||||
msgstr "任务失败"
|
msgstr "任务失败"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:32
|
#: bookwyrm/templates/import/import_status.html:32
|
||||||
msgid "Import still in progress."
|
msgid "Import still in progress."
|
||||||
msgstr "还在导入中。"
|
msgstr "还在导入中。"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:34
|
#: bookwyrm/templates/import/import_status.html:34
|
||||||
msgid "(Hit reload to update!)"
|
msgid "(Hit reload to update!)"
|
||||||
msgstr "(按下重新加载来更新!)"
|
msgstr "(按下重新加载来更新!)"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:41
|
#: bookwyrm/templates/import/import_status.html:41
|
||||||
msgid "Failed to load"
|
msgid "Failed to load"
|
||||||
msgstr "加载失败"
|
msgstr "加载失败"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:50
|
#: bookwyrm/templates/import/import_status.html:50
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
|
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
|
||||||
msgstr "跳转至列表底部来选取 %(failed_count)s 个导入失败的项目。"
|
msgstr "跳转至列表底部来选取 %(failed_count)s 个导入失败的项目。"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:62
|
#: bookwyrm/templates/import/import_status.html:62
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Line %(index)s: <strong>%(title)s</strong> by %(author)s"
|
msgid "Line %(index)s: <strong>%(title)s</strong> by %(author)s"
|
||||||
msgstr "第 %(index)s 行: %(author)s 所著的 <strong>%(title)s</strong>"
|
msgstr "第 %(index)s 行: %(author)s 所著的 <strong>%(title)s</strong>"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:82
|
#: bookwyrm/templates/import/import_status.html:82
|
||||||
msgid "Select all"
|
msgid "Select all"
|
||||||
msgstr "全选"
|
msgstr "全选"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:85
|
#: bookwyrm/templates/import/import_status.html:85
|
||||||
msgid "Retry items"
|
msgid "Retry items"
|
||||||
msgstr "重试项目"
|
msgstr "重试项目"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:112
|
#: bookwyrm/templates/import/import_status.html:112
|
||||||
msgid "Successfully imported"
|
msgid "Successfully imported"
|
||||||
msgstr "成功导入了"
|
msgstr "成功导入了"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:114
|
#: bookwyrm/templates/import/import_status.html:114
|
||||||
msgid "Import Progress"
|
msgid "Import Progress"
|
||||||
msgstr "导入进度"
|
msgstr "导入进度"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:119
|
#: bookwyrm/templates/import/import_status.html:119
|
||||||
msgid "Book"
|
msgid "Book"
|
||||||
msgstr "书目"
|
msgstr "书目"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:122
|
#: bookwyrm/templates/import/import_status.html:122
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:111
|
#: bookwyrm/templates/user/shelf/shelf.html:111
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:131
|
#: bookwyrm/templates/user/shelf/shelf.html:131
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "标题"
|
msgstr "标题"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:125
|
#: bookwyrm/templates/import/import_status.html:125
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:112
|
#: bookwyrm/templates/user/shelf/shelf.html:112
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:134
|
#: bookwyrm/templates/user/shelf/shelf.html:134
|
||||||
msgid "Author"
|
msgid "Author"
|
||||||
msgstr "作者"
|
msgstr "作者"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:148
|
#: bookwyrm/templates/import/import_status.html:148
|
||||||
msgid "Imported"
|
msgid "Imported"
|
||||||
msgstr "已导入"
|
msgstr "已导入"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/import/tooltip.html:6
|
||||||
|
msgid "You can download your GoodReads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener\">Import/Export page</a> of your GoodReads account."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12
|
#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12
|
||||||
#: bookwyrm/templates/login.html:51
|
#: bookwyrm/templates/login.html:51
|
||||||
msgid "Create an Account"
|
msgid "Create an Account"
|
||||||
|
@ -1477,8 +1489,25 @@ msgstr "批准"
|
||||||
msgid "Discard"
|
msgid "Discard"
|
||||||
msgstr "削除"
|
msgstr "削除"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:4
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Delete this progress update"
|
||||||
|
msgid "Delete this list?"
|
||||||
|
msgstr "删除此进度更新"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:7
|
||||||
|
msgid "This action cannot be un-done"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:15
|
||||||
|
#: bookwyrm/templates/settings/announcement.html:20
|
||||||
|
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15
|
||||||
|
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
|
||||||
|
msgid "Delete"
|
||||||
|
msgstr "删除"
|
||||||
|
|
||||||
#: bookwyrm/templates/lists/edit_form.html:5
|
#: bookwyrm/templates/lists/edit_form.html:5
|
||||||
#: bookwyrm/templates/lists/list_layout.html:16
|
#: bookwyrm/templates/lists/layout.html:16
|
||||||
msgid "Edit List"
|
msgid "Edit List"
|
||||||
msgstr "编辑列表"
|
msgstr "编辑列表"
|
||||||
|
|
||||||
|
@ -1513,6 +1542,12 @@ msgstr "开放"
|
||||||
msgid "Anyone can add books to this list"
|
msgid "Anyone can add books to this list"
|
||||||
msgstr "任何人都可以向此列表中添加书目"
|
msgstr "任何人都可以向此列表中添加书目"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/form.html:49
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Delete status"
|
||||||
|
msgid "Delete list"
|
||||||
|
msgstr "删除发文"
|
||||||
|
|
||||||
#: bookwyrm/templates/lists/list.html:20
|
#: bookwyrm/templates/lists/list.html:20
|
||||||
msgid "You successfully suggested a book for this list!"
|
msgid "You successfully suggested a book for this list!"
|
||||||
msgstr "你成功向该列表推荐了一本书!"
|
msgstr "你成功向该列表推荐了一本书!"
|
||||||
|
@ -1909,6 +1944,7 @@ msgid "Account"
|
||||||
msgstr "帐号"
|
msgstr "帐号"
|
||||||
|
|
||||||
#: bookwyrm/templates/preferences/layout.html:15
|
#: bookwyrm/templates/preferences/layout.html:15
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:7
|
||||||
msgid "Profile"
|
msgid "Profile"
|
||||||
msgstr "个人资料"
|
msgstr "个人资料"
|
||||||
|
|
||||||
|
@ -2029,12 +2065,6 @@ msgstr "回到列表"
|
||||||
msgid "Edit Announcement"
|
msgid "Edit Announcement"
|
||||||
msgstr "编辑公告"
|
msgstr "编辑公告"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/announcement.html:20
|
|
||||||
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15
|
|
||||||
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
|
|
||||||
msgid "Delete"
|
|
||||||
msgstr "删除"
|
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/announcement.html:35
|
#: bookwyrm/templates/settings/announcement.html:35
|
||||||
msgid "Visible:"
|
msgid "Visible:"
|
||||||
msgstr "可见:"
|
msgstr "可见:"
|
||||||
|
@ -2085,6 +2115,7 @@ msgstr "结束日期"
|
||||||
#: bookwyrm/templates/settings/manage_invite_requests.html:44
|
#: bookwyrm/templates/settings/manage_invite_requests.html:44
|
||||||
#: bookwyrm/templates/settings/status_filter.html:5
|
#: bookwyrm/templates/settings/status_filter.html:5
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:34
|
#: bookwyrm/templates/user_admin/user_admin.html:34
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:20
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "状态"
|
msgstr "状态"
|
||||||
|
|
||||||
|
@ -2122,7 +2153,7 @@ msgstr "实例:"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:37
|
#: bookwyrm/templates/settings/edit_server.html:37
|
||||||
#: bookwyrm/templates/settings/federated_server.html:31
|
#: bookwyrm/templates/settings/federated_server.html:31
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:34
|
#: bookwyrm/templates/user_admin/user_info.html:125
|
||||||
msgid "Status:"
|
msgid "Status:"
|
||||||
msgstr "状态:"
|
msgstr "状态:"
|
||||||
|
|
||||||
|
@ -2137,13 +2168,13 @@ msgstr "已屏蔽"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:48
|
#: bookwyrm/templates/settings/edit_server.html:48
|
||||||
#: bookwyrm/templates/settings/federated_server.html:23
|
#: bookwyrm/templates/settings/federated_server.html:23
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:26
|
#: bookwyrm/templates/user_admin/user_info.html:117
|
||||||
msgid "Software:"
|
msgid "Software:"
|
||||||
msgstr "软件:"
|
msgstr "软件:"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:55
|
#: bookwyrm/templates/settings/edit_server.html:55
|
||||||
#: bookwyrm/templates/settings/federated_server.html:27
|
#: bookwyrm/templates/settings/federated_server.html:27
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:30
|
#: bookwyrm/templates/user_admin/user_info.html:121
|
||||||
msgid "Version:"
|
msgid "Version:"
|
||||||
msgstr "版本:"
|
msgstr "版本:"
|
||||||
|
|
||||||
|
@ -2170,6 +2201,7 @@ msgid "View all"
|
||||||
msgstr "查看全部"
|
msgstr "查看全部"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/federated_server.html:50
|
#: bookwyrm/templates/settings/federated_server.html:50
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:59
|
||||||
msgid "Reports:"
|
msgid "Reports:"
|
||||||
msgstr "报告:"
|
msgstr "报告:"
|
||||||
|
|
||||||
|
@ -2186,7 +2218,7 @@ msgid "Blocked by us:"
|
||||||
msgstr "我们所屏蔽的:"
|
msgstr "我们所屏蔽的:"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/federated_server.html:82
|
#: bookwyrm/templates/settings/federated_server.html:82
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:39
|
#: bookwyrm/templates/user_admin/user_info.html:130
|
||||||
msgid "Notes"
|
msgid "Notes"
|
||||||
msgstr "备注"
|
msgstr "备注"
|
||||||
|
|
||||||
|
@ -3106,7 +3138,7 @@ msgstr[0] "%(mutuals_display)s 个你也关注的关注者"
|
||||||
msgid "No followers you follow"
|
msgid "No followers you follow"
|
||||||
msgstr "没有你关注的关注者"
|
msgstr "没有你关注的关注者"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user.html:9
|
#: bookwyrm/templates/user_admin/user.html:8
|
||||||
msgid "Back to users"
|
msgid "Back to users"
|
||||||
msgstr "回到用户"
|
msgstr "回到用户"
|
||||||
|
|
||||||
|
@ -3133,31 +3165,83 @@ msgid "Remote instance"
|
||||||
msgstr "移除服务器"
|
msgstr "移除服务器"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:47
|
#: bookwyrm/templates/user_admin/user_admin.html:47
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:24
|
||||||
msgid "Active"
|
msgid "Active"
|
||||||
msgstr "活跃"
|
msgstr "活跃"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:47
|
#: bookwyrm/templates/user_admin/user_admin.html:47
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:28
|
||||||
msgid "Inactive"
|
msgid "Inactive"
|
||||||
msgstr "停用"
|
msgstr "停用"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:52
|
#: bookwyrm/templates/user_admin/user_admin.html:52
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:49
|
#: bookwyrm/templates/user_admin/user_info.html:140
|
||||||
msgid "Not set"
|
msgid "Not set"
|
||||||
msgstr "未设置"
|
msgstr "未设置"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:5
|
#: bookwyrm/templates/user_admin/user_info.html:16
|
||||||
msgid "User details"
|
|
||||||
msgstr "用户详情"
|
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:14
|
|
||||||
msgid "View user profile"
|
msgid "View user profile"
|
||||||
msgstr "查看用户个人资料"
|
msgstr "查看用户个人资料"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:20
|
#: bookwyrm/templates/user_admin/user_info.html:36
|
||||||
|
msgid "Local"
|
||||||
|
msgstr "本站"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:38
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Remove"
|
||||||
|
msgid "Remote"
|
||||||
|
msgstr "移除"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:47
|
||||||
|
msgid "User details"
|
||||||
|
msgstr "用户详情"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:52
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Email"
|
||||||
|
msgid "Email:"
|
||||||
|
msgstr "邮箱"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:64
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Directory"
|
||||||
|
msgid "(View reports)"
|
||||||
|
msgstr "目录"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:72
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Blocked by us:"
|
||||||
|
msgid "Blocked by count:"
|
||||||
|
msgstr "我们所屏蔽的:"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:77
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "last active"
|
||||||
|
msgid "Last active date:"
|
||||||
|
msgstr "最后活跃"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:82
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Manually approve followers:"
|
||||||
|
msgid "Manually approved followers:"
|
||||||
|
msgstr "手动批准关注者:"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:87
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Discover"
|
||||||
|
msgid "Discoverable:"
|
||||||
|
msgstr "发现"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:93
|
||||||
|
msgid "Deactivation reason:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:111
|
||||||
msgid "Instance details"
|
msgid "Instance details"
|
||||||
msgstr "实例详情"
|
msgstr "实例详情"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:46
|
#: bookwyrm/templates/user_admin/user_info.html:137
|
||||||
msgid "View instance"
|
msgid "View instance"
|
||||||
msgstr "查看实例"
|
msgstr "查看实例"
|
||||||
|
|
||||||
|
@ -3186,14 +3270,14 @@ msgstr "文件超过了最大大小: 10MB"
|
||||||
msgid "%(title)s: %(subtitle)s"
|
msgid "%(title)s: %(subtitle)s"
|
||||||
msgstr "%(title)s:%(subtitle)s"
|
msgstr "%(title)s:%(subtitle)s"
|
||||||
|
|
||||||
#: bookwyrm/views/authentication.py:69
|
|
||||||
msgid "Username or password are incorrect"
|
|
||||||
msgstr "用户名或密码不正确"
|
|
||||||
|
|
||||||
#: bookwyrm/views/import_data.py:67
|
#: bookwyrm/views/import_data.py:67
|
||||||
msgid "Not a valid csv file"
|
msgid "Not a valid csv file"
|
||||||
msgstr "不是有效的 csv 文件"
|
msgstr "不是有效的 csv 文件"
|
||||||
|
|
||||||
|
#: bookwyrm/views/login.py:70
|
||||||
|
msgid "Username or password are incorrect"
|
||||||
|
msgstr "用户名或密码不正确"
|
||||||
|
|
||||||
#: bookwyrm/views/password.py:32
|
#: bookwyrm/views/password.py:32
|
||||||
msgid "No user with that email address was found."
|
msgid "No user with that email address was found."
|
||||||
msgstr "没有找到使用该邮箱的用户。"
|
msgstr "没有找到使用该邮箱的用户。"
|
||||||
|
@ -3219,6 +3303,3 @@ msgstr ""
|
||||||
|
|
||||||
#~ msgid "Federated Timeline"
|
#~ msgid "Federated Timeline"
|
||||||
#~ msgstr "跨站时间线"
|
#~ msgstr "跨站时间线"
|
||||||
|
|
||||||
#~ msgid "Local"
|
|
||||||
#~ msgstr "本站"
|
|
||||||
|
|
Binary file not shown.
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 0.0.1\n"
|
"Project-Id-Version: 0.0.1\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-09-05 23:09+0000\n"
|
"POT-Creation-Date: 2021-09-08 15:57+0000\n"
|
||||||
"PO-Revision-Date: 2021-06-30 10:36+0000\n"
|
"PO-Revision-Date: 2021-06-30 10:36+0000\n"
|
||||||
"Last-Translator: Grace Cheng <chengracecwy@gmail.com>\n"
|
"Last-Translator: Grace Cheng <chengracecwy@gmail.com>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -92,47 +92,47 @@ msgstr "使用者名稱"
|
||||||
msgid "A user with that username already exists."
|
msgid "A user with that username already exists."
|
||||||
msgstr "已經存在使用該名稱的使用者。"
|
msgstr "已經存在使用該名稱的使用者。"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:124
|
#: bookwyrm/settings.py:113
|
||||||
msgid "Home Timeline"
|
msgid "Home Timeline"
|
||||||
msgstr "主頁時間線"
|
msgstr "主頁時間線"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:124
|
#: bookwyrm/settings.py:113
|
||||||
msgid "Home"
|
msgid "Home"
|
||||||
msgstr "主頁"
|
msgstr "主頁"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:125
|
#: bookwyrm/settings.py:114
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Book Title"
|
#| msgid "Book Title"
|
||||||
msgid "Books Timeline"
|
msgid "Books Timeline"
|
||||||
msgstr "書名"
|
msgstr "書名"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:125 bookwyrm/templates/search/layout.html:21
|
#: bookwyrm/settings.py:114 bookwyrm/templates/search/layout.html:21
|
||||||
#: bookwyrm/templates/search/layout.html:42
|
#: bookwyrm/templates/search/layout.html:42
|
||||||
#: bookwyrm/templates/user/layout.html:81
|
#: bookwyrm/templates/user/layout.html:81
|
||||||
msgid "Books"
|
msgid "Books"
|
||||||
msgstr "書目"
|
msgstr "書目"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:171
|
#: bookwyrm/settings.py:160
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "English(英語)"
|
msgstr "English(英語)"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:172
|
#: bookwyrm/settings.py:161
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr "Deutsch(德語)"
|
msgstr "Deutsch(德語)"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:173
|
#: bookwyrm/settings.py:162
|
||||||
msgid "Spanish"
|
msgid "Spanish"
|
||||||
msgstr "Español(西班牙語)"
|
msgstr "Español(西班牙語)"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:174
|
#: bookwyrm/settings.py:163
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr "Français(法語)"
|
msgstr "Français(法語)"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:175
|
#: bookwyrm/settings.py:164
|
||||||
msgid "Simplified Chinese"
|
msgid "Simplified Chinese"
|
||||||
msgstr "簡體中文"
|
msgstr "簡體中文"
|
||||||
|
|
||||||
#: bookwyrm/settings.py:176
|
#: bookwyrm/settings.py:165
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Tranditional Chinese"
|
#| msgid "Tranditional Chinese"
|
||||||
msgid "Traditional Chinese"
|
msgid "Traditional Chinese"
|
||||||
|
@ -285,7 +285,7 @@ msgstr "Goodreads key:"
|
||||||
#: bookwyrm/templates/book/edit_book.html:328
|
#: bookwyrm/templates/book/edit_book.html:328
|
||||||
#: bookwyrm/templates/book/readthrough.html:76
|
#: bookwyrm/templates/book/readthrough.html:76
|
||||||
#: bookwyrm/templates/lists/bookmark_button.html:15
|
#: bookwyrm/templates/lists/bookmark_button.html:15
|
||||||
#: bookwyrm/templates/lists/form.html:42
|
#: bookwyrm/templates/lists/form.html:44
|
||||||
#: bookwyrm/templates/preferences/edit_user.html:78
|
#: bookwyrm/templates/preferences/edit_user.html:78
|
||||||
#: bookwyrm/templates/settings/announcement_form.html:69
|
#: bookwyrm/templates/settings/announcement_form.html:69
|
||||||
#: bookwyrm/templates/settings/edit_server.html:68
|
#: bookwyrm/templates/settings/edit_server.html:68
|
||||||
|
@ -302,6 +302,7 @@ msgstr "儲存"
|
||||||
#: bookwyrm/templates/book/cover_modal.html:32
|
#: bookwyrm/templates/book/cover_modal.html:32
|
||||||
#: bookwyrm/templates/book/edit_book.html:329
|
#: bookwyrm/templates/book/edit_book.html:329
|
||||||
#: bookwyrm/templates/book/readthrough.html:77
|
#: bookwyrm/templates/book/readthrough.html:77
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:17
|
||||||
#: bookwyrm/templates/moderation/report_modal.html:34
|
#: bookwyrm/templates/moderation/report_modal.html:34
|
||||||
#: bookwyrm/templates/settings/federated_server.html:99
|
#: bookwyrm/templates/settings/federated_server.html:99
|
||||||
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
|
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
|
||||||
|
@ -681,6 +682,7 @@ msgstr "搜尋結果"
|
||||||
|
|
||||||
#: bookwyrm/templates/components/inline_form.html:8
|
#: bookwyrm/templates/components/inline_form.html:8
|
||||||
#: bookwyrm/templates/components/modal.html:11
|
#: bookwyrm/templates/components/modal.html:11
|
||||||
|
#: bookwyrm/templates/components/tooltip.html:7
|
||||||
#: bookwyrm/templates/feed/layout.html:71
|
#: bookwyrm/templates/feed/layout.html:71
|
||||||
#: bookwyrm/templates/get_started/layout.html:20
|
#: bookwyrm/templates/get_started/layout.html:20
|
||||||
#: bookwyrm/templates/get_started/layout.html:53
|
#: bookwyrm/templates/get_started/layout.html:53
|
||||||
|
@ -689,6 +691,10 @@ msgstr "搜尋結果"
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "關閉"
|
msgstr "關閉"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/components/tooltip.html:3
|
||||||
|
msgid "Help"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8
|
#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8
|
||||||
msgid "Compose status"
|
msgid "Compose status"
|
||||||
msgstr "撰寫狀態"
|
msgstr "撰寫狀態"
|
||||||
|
@ -714,6 +720,7 @@ msgid "Sorry! We couldn't find that code."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/confirm_email/confirm_email.html:19
|
#: bookwyrm/templates/confirm_email/confirm_email.html:19
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:100
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Confirm password:"
|
#| msgid "Confirm password:"
|
||||||
msgid "Confirmation code:"
|
msgid "Confirmation code:"
|
||||||
|
@ -1194,123 +1201,128 @@ msgstr "你 %(year)s 的書目"
|
||||||
msgid "%(username)s's %(year)s Books"
|
msgid "%(username)s's %(year)s Books"
|
||||||
msgstr "%(username)s 在 %(year)s 的書目"
|
msgstr "%(username)s 在 %(year)s 的書目"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9
|
#: bookwyrm/templates/import/import.html:5
|
||||||
|
#: bookwyrm/templates/import/import.html:9
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:57
|
#: bookwyrm/templates/user/shelf/shelf.html:57
|
||||||
msgid "Import Books"
|
msgid "Import Books"
|
||||||
msgstr "匯入書目"
|
msgstr "匯入書目"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:16
|
#: bookwyrm/templates/import/import.html:18
|
||||||
msgid "Data source:"
|
msgid "Data source:"
|
||||||
msgstr "資料來源:"
|
msgstr "資料來源:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:32
|
#: bookwyrm/templates/import/import.html:37
|
||||||
msgid "Data file:"
|
msgid "Data file:"
|
||||||
msgstr "資料檔案:"
|
msgstr "資料檔案:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:40
|
#: bookwyrm/templates/import/import.html:45
|
||||||
msgid "Include reviews"
|
msgid "Include reviews"
|
||||||
msgstr "納入書評"
|
msgstr "納入書評"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:45
|
#: bookwyrm/templates/import/import.html:50
|
||||||
msgid "Privacy setting for imported reviews:"
|
msgid "Privacy setting for imported reviews:"
|
||||||
msgstr "匯入書評的隱私設定"
|
msgstr "匯入書評的隱私設定"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:51
|
#: bookwyrm/templates/import/import.html:56
|
||||||
#: bookwyrm/templates/settings/server_blocklist.html:64
|
#: bookwyrm/templates/settings/server_blocklist.html:64
|
||||||
msgid "Import"
|
msgid "Import"
|
||||||
msgstr "匯入"
|
msgstr "匯入"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:56
|
#: bookwyrm/templates/import/import.html:61
|
||||||
msgid "Recent Imports"
|
msgid "Recent Imports"
|
||||||
msgstr "最近的匯入"
|
msgstr "最近的匯入"
|
||||||
|
|
||||||
#: bookwyrm/templates/import.html:58
|
#: bookwyrm/templates/import/import.html:63
|
||||||
msgid "No recent imports"
|
msgid "No recent imports"
|
||||||
msgstr "無最近的匯入"
|
msgstr "無最近的匯入"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:6
|
#: bookwyrm/templates/import/import_status.html:6
|
||||||
#: bookwyrm/templates/import_status.html:10
|
#: bookwyrm/templates/import/import_status.html:10
|
||||||
msgid "Import Status"
|
msgid "Import Status"
|
||||||
msgstr "匯入狀態"
|
msgstr "匯入狀態"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:11
|
#: bookwyrm/templates/import/import_status.html:11
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Back to reports"
|
#| msgid "Back to reports"
|
||||||
msgid "Back to imports"
|
msgid "Back to imports"
|
||||||
msgstr "回到舉報"
|
msgstr "回到舉報"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:15
|
#: bookwyrm/templates/import/import_status.html:15
|
||||||
msgid "Import started:"
|
msgid "Import started:"
|
||||||
msgstr "匯入開始:"
|
msgstr "匯入開始:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:20
|
#: bookwyrm/templates/import/import_status.html:20
|
||||||
msgid "Import completed:"
|
msgid "Import completed:"
|
||||||
msgstr "匯入完成:"
|
msgstr "匯入完成:"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:24
|
#: bookwyrm/templates/import/import_status.html:24
|
||||||
msgid "TASK FAILED"
|
msgid "TASK FAILED"
|
||||||
msgstr "任務失敗"
|
msgstr "任務失敗"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:32
|
#: bookwyrm/templates/import/import_status.html:32
|
||||||
msgid "Import still in progress."
|
msgid "Import still in progress."
|
||||||
msgstr "還在匯入中。"
|
msgstr "還在匯入中。"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:34
|
#: bookwyrm/templates/import/import_status.html:34
|
||||||
msgid "(Hit reload to update!)"
|
msgid "(Hit reload to update!)"
|
||||||
msgstr "(按下重新載入來更新!)"
|
msgstr "(按下重新載入來更新!)"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:41
|
#: bookwyrm/templates/import/import_status.html:41
|
||||||
msgid "Failed to load"
|
msgid "Failed to load"
|
||||||
msgstr "載入失敗"
|
msgstr "載入失敗"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:50
|
#: bookwyrm/templates/import/import_status.html:50
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
|
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
|
||||||
msgstr "跳轉至列表底部來選取 %(failed_count)s 個匯入失敗的項目。"
|
msgstr "跳轉至列表底部來選取 %(failed_count)s 個匯入失敗的項目。"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:62
|
#: bookwyrm/templates/import/import_status.html:62
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Line %(index)s: <strong>%(title)s</strong> by %(author)s"
|
msgid "Line %(index)s: <strong>%(title)s</strong> by %(author)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:82
|
#: bookwyrm/templates/import/import_status.html:82
|
||||||
msgid "Select all"
|
msgid "Select all"
|
||||||
msgstr "全選"
|
msgstr "全選"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:85
|
#: bookwyrm/templates/import/import_status.html:85
|
||||||
msgid "Retry items"
|
msgid "Retry items"
|
||||||
msgstr "重試項目"
|
msgstr "重試項目"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:112
|
#: bookwyrm/templates/import/import_status.html:112
|
||||||
msgid "Successfully imported"
|
msgid "Successfully imported"
|
||||||
msgstr "成功匯入了"
|
msgstr "成功匯入了"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:114
|
#: bookwyrm/templates/import/import_status.html:114
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Import still in progress."
|
#| msgid "Import still in progress."
|
||||||
msgid "Import Progress"
|
msgid "Import Progress"
|
||||||
msgstr "還在匯入中。"
|
msgstr "還在匯入中。"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:119
|
#: bookwyrm/templates/import/import_status.html:119
|
||||||
msgid "Book"
|
msgid "Book"
|
||||||
msgstr "書目"
|
msgstr "書目"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:122
|
#: bookwyrm/templates/import/import_status.html:122
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:111
|
#: bookwyrm/templates/user/shelf/shelf.html:111
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:131
|
#: bookwyrm/templates/user/shelf/shelf.html:131
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "標題"
|
msgstr "標題"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:125
|
#: bookwyrm/templates/import/import_status.html:125
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:112
|
#: bookwyrm/templates/user/shelf/shelf.html:112
|
||||||
#: bookwyrm/templates/user/shelf/shelf.html:134
|
#: bookwyrm/templates/user/shelf/shelf.html:134
|
||||||
msgid "Author"
|
msgid "Author"
|
||||||
msgstr "作者"
|
msgstr "作者"
|
||||||
|
|
||||||
#: bookwyrm/templates/import_status.html:148
|
#: bookwyrm/templates/import/import_status.html:148
|
||||||
msgid "Imported"
|
msgid "Imported"
|
||||||
msgstr "已匯入"
|
msgstr "已匯入"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/import/tooltip.html:6
|
||||||
|
msgid "You can download your GoodReads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"noopener\">Import/Export page</a> of your GoodReads account."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12
|
#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12
|
||||||
#: bookwyrm/templates/login.html:51
|
#: bookwyrm/templates/login.html:51
|
||||||
msgid "Create an Account"
|
msgid "Create an Account"
|
||||||
|
@ -1506,8 +1518,25 @@ msgstr "批准"
|
||||||
msgid "Discard"
|
msgid "Discard"
|
||||||
msgstr "放棄"
|
msgstr "放棄"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:4
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Delete this progress update"
|
||||||
|
msgid "Delete this list?"
|
||||||
|
msgstr "刪除此進度更新"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:7
|
||||||
|
msgid "This action cannot be un-done"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/delete_list_modal.html:15
|
||||||
|
#: bookwyrm/templates/settings/announcement.html:20
|
||||||
|
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15
|
||||||
|
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
|
||||||
|
msgid "Delete"
|
||||||
|
msgstr "刪除"
|
||||||
|
|
||||||
#: bookwyrm/templates/lists/edit_form.html:5
|
#: bookwyrm/templates/lists/edit_form.html:5
|
||||||
#: bookwyrm/templates/lists/list_layout.html:16
|
#: bookwyrm/templates/lists/layout.html:16
|
||||||
msgid "Edit List"
|
msgid "Edit List"
|
||||||
msgstr "編輯列表"
|
msgstr "編輯列表"
|
||||||
|
|
||||||
|
@ -1542,6 +1571,12 @@ msgstr "開放"
|
||||||
msgid "Anyone can add books to this list"
|
msgid "Anyone can add books to this list"
|
||||||
msgstr "任何人都可以向此列表新增書目"
|
msgstr "任何人都可以向此列表新增書目"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/lists/form.html:49
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Delete status"
|
||||||
|
msgid "Delete list"
|
||||||
|
msgstr "刪除狀態"
|
||||||
|
|
||||||
#: bookwyrm/templates/lists/list.html:20
|
#: bookwyrm/templates/lists/list.html:20
|
||||||
msgid "You successfully suggested a book for this list!"
|
msgid "You successfully suggested a book for this list!"
|
||||||
msgstr "你成功!向該列表推薦了一本書"
|
msgstr "你成功!向該列表推薦了一本書"
|
||||||
|
@ -1941,6 +1976,7 @@ msgid "Account"
|
||||||
msgstr "帳號"
|
msgstr "帳號"
|
||||||
|
|
||||||
#: bookwyrm/templates/preferences/layout.html:15
|
#: bookwyrm/templates/preferences/layout.html:15
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:7
|
||||||
msgid "Profile"
|
msgid "Profile"
|
||||||
msgstr "使用者資料"
|
msgstr "使用者資料"
|
||||||
|
|
||||||
|
@ -2064,12 +2100,6 @@ msgstr "回到列表"
|
||||||
msgid "Edit Announcement"
|
msgid "Edit Announcement"
|
||||||
msgstr "編輯公告"
|
msgstr "編輯公告"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/announcement.html:20
|
|
||||||
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15
|
|
||||||
#: bookwyrm/templates/snippets/follow_request_buttons.html:12
|
|
||||||
msgid "Delete"
|
|
||||||
msgstr "刪除"
|
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/announcement.html:35
|
#: bookwyrm/templates/settings/announcement.html:35
|
||||||
msgid "Visible:"
|
msgid "Visible:"
|
||||||
msgstr "可見:"
|
msgstr "可見:"
|
||||||
|
@ -2120,6 +2150,7 @@ msgstr "結束日期"
|
||||||
#: bookwyrm/templates/settings/manage_invite_requests.html:44
|
#: bookwyrm/templates/settings/manage_invite_requests.html:44
|
||||||
#: bookwyrm/templates/settings/status_filter.html:5
|
#: bookwyrm/templates/settings/status_filter.html:5
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:34
|
#: bookwyrm/templates/user_admin/user_admin.html:34
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:20
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "狀態"
|
msgstr "狀態"
|
||||||
|
|
||||||
|
@ -2157,7 +2188,7 @@ msgstr "實例:"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:37
|
#: bookwyrm/templates/settings/edit_server.html:37
|
||||||
#: bookwyrm/templates/settings/federated_server.html:31
|
#: bookwyrm/templates/settings/federated_server.html:31
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:34
|
#: bookwyrm/templates/user_admin/user_info.html:125
|
||||||
msgid "Status:"
|
msgid "Status:"
|
||||||
msgstr "狀態:"
|
msgstr "狀態:"
|
||||||
|
|
||||||
|
@ -2172,13 +2203,13 @@ msgstr "已封鎖"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:48
|
#: bookwyrm/templates/settings/edit_server.html:48
|
||||||
#: bookwyrm/templates/settings/federated_server.html:23
|
#: bookwyrm/templates/settings/federated_server.html:23
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:26
|
#: bookwyrm/templates/user_admin/user_info.html:117
|
||||||
msgid "Software:"
|
msgid "Software:"
|
||||||
msgstr "軟件:"
|
msgstr "軟件:"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/edit_server.html:55
|
#: bookwyrm/templates/settings/edit_server.html:55
|
||||||
#: bookwyrm/templates/settings/federated_server.html:27
|
#: bookwyrm/templates/settings/federated_server.html:27
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:30
|
#: bookwyrm/templates/user_admin/user_info.html:121
|
||||||
msgid "Version:"
|
msgid "Version:"
|
||||||
msgstr "版本:"
|
msgstr "版本:"
|
||||||
|
|
||||||
|
@ -2205,6 +2236,7 @@ msgid "View all"
|
||||||
msgstr "檢視全部"
|
msgstr "檢視全部"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/federated_server.html:50
|
#: bookwyrm/templates/settings/federated_server.html:50
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:59
|
||||||
msgid "Reports:"
|
msgid "Reports:"
|
||||||
msgstr "舉報:"
|
msgstr "舉報:"
|
||||||
|
|
||||||
|
@ -2221,7 +2253,7 @@ msgid "Blocked by us:"
|
||||||
msgstr "我們所封鎖的:"
|
msgstr "我們所封鎖的:"
|
||||||
|
|
||||||
#: bookwyrm/templates/settings/federated_server.html:82
|
#: bookwyrm/templates/settings/federated_server.html:82
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:39
|
#: bookwyrm/templates/user_admin/user_info.html:130
|
||||||
msgid "Notes"
|
msgid "Notes"
|
||||||
msgstr "備註"
|
msgstr "備註"
|
||||||
|
|
||||||
|
@ -3164,7 +3196,7 @@ msgstr[0] "%(mutuals_display)s 個你也關注的關注者"
|
||||||
msgid "No followers you follow"
|
msgid "No followers you follow"
|
||||||
msgstr "你關注的關注者"
|
msgstr "你關注的關注者"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user.html:9
|
#: bookwyrm/templates/user_admin/user.html:8
|
||||||
msgid "Back to users"
|
msgid "Back to users"
|
||||||
msgstr "回到使用者"
|
msgstr "回到使用者"
|
||||||
|
|
||||||
|
@ -3191,31 +3223,83 @@ msgid "Remote instance"
|
||||||
msgstr "移除伺服器"
|
msgstr "移除伺服器"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:47
|
#: bookwyrm/templates/user_admin/user_admin.html:47
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:24
|
||||||
msgid "Active"
|
msgid "Active"
|
||||||
msgstr "活躍"
|
msgstr "活躍"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:47
|
#: bookwyrm/templates/user_admin/user_admin.html:47
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:28
|
||||||
msgid "Inactive"
|
msgid "Inactive"
|
||||||
msgstr "停用"
|
msgstr "停用"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_admin.html:52
|
#: bookwyrm/templates/user_admin/user_admin.html:52
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:49
|
#: bookwyrm/templates/user_admin/user_info.html:140
|
||||||
msgid "Not set"
|
msgid "Not set"
|
||||||
msgstr "未設定"
|
msgstr "未設定"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:5
|
#: bookwyrm/templates/user_admin/user_info.html:16
|
||||||
msgid "User details"
|
|
||||||
msgstr "使用者詳情"
|
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:14
|
|
||||||
msgid "View user profile"
|
msgid "View user profile"
|
||||||
msgstr "檢視使用者資料"
|
msgstr "檢視使用者資料"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:20
|
#: bookwyrm/templates/user_admin/user_info.html:36
|
||||||
|
msgid "Local"
|
||||||
|
msgstr "本站"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:38
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Remove"
|
||||||
|
msgid "Remote"
|
||||||
|
msgstr "移除"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:47
|
||||||
|
msgid "User details"
|
||||||
|
msgstr "使用者詳情"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:52
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Email"
|
||||||
|
msgid "Email:"
|
||||||
|
msgstr "郵箱"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:64
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Directory"
|
||||||
|
msgid "(View reports)"
|
||||||
|
msgstr "目錄"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:72
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Blocked by us:"
|
||||||
|
msgid "Blocked by count:"
|
||||||
|
msgstr "我們所封鎖的:"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:77
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "last active"
|
||||||
|
msgid "Last active date:"
|
||||||
|
msgstr "最後活躍"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:82
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Manually approve followers:"
|
||||||
|
msgid "Manually approved followers:"
|
||||||
|
msgstr "手動批准關注者:"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:87
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Discard"
|
||||||
|
msgid "Discoverable:"
|
||||||
|
msgstr "放棄"
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:93
|
||||||
|
msgid "Deactivation reason:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: bookwyrm/templates/user_admin/user_info.html:111
|
||||||
msgid "Instance details"
|
msgid "Instance details"
|
||||||
msgstr "實例詳情"
|
msgstr "實例詳情"
|
||||||
|
|
||||||
#: bookwyrm/templates/user_admin/user_info.html:46
|
#: bookwyrm/templates/user_admin/user_info.html:137
|
||||||
msgid "View instance"
|
msgid "View instance"
|
||||||
msgstr "檢視實例"
|
msgstr "檢視實例"
|
||||||
|
|
||||||
|
@ -3244,14 +3328,14 @@ msgstr "檔案超過了最大大小: 10MB"
|
||||||
msgid "%(title)s: %(subtitle)s"
|
msgid "%(title)s: %(subtitle)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/views/authentication.py:69
|
|
||||||
msgid "Username or password are incorrect"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: bookwyrm/views/import_data.py:67
|
#: bookwyrm/views/import_data.py:67
|
||||||
msgid "Not a valid csv file"
|
msgid "Not a valid csv file"
|
||||||
msgstr "不是有效的 csv 檔案"
|
msgstr "不是有效的 csv 檔案"
|
||||||
|
|
||||||
|
#: bookwyrm/views/login.py:70
|
||||||
|
msgid "Username or password are incorrect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: bookwyrm/views/password.py:32
|
#: bookwyrm/views/password.py:32
|
||||||
msgid "No user with that email address was found."
|
msgid "No user with that email address was found."
|
||||||
msgstr "沒有找到使用該郵箱的使用者。"
|
msgstr "沒有找到使用該郵箱的使用者。"
|
||||||
|
@ -3277,6 +3361,3 @@ msgstr ""
|
||||||
|
|
||||||
#~ msgid "Federated Timeline"
|
#~ msgid "Federated Timeline"
|
||||||
#~ msgstr "跨站時間線"
|
#~ msgstr "跨站時間線"
|
||||||
|
|
||||||
#~ msgid "Local"
|
|
||||||
#~ msgstr "本站"
|
|
||||||
|
|
Loading…
Reference in a new issue