Merge pull request #1253 from bookwyrm-social/new-feeds

Use Home and Books feeds instead of Home/Local/Federated feeds
This commit is contained in:
Mouse Reeve 2021-08-05 15:53:31 -06:00 committed by GitHub
commit ac52142146
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 494 additions and 322 deletions

View file

@ -4,11 +4,12 @@ from django.db.models import signals, Q
from bookwyrm import models from bookwyrm import models
from bookwyrm.redis_store import RedisStore, r from bookwyrm.redis_store import RedisStore, r
from bookwyrm.settings import STREAMS
from bookwyrm.views.helpers import privacy_filter from bookwyrm.views.helpers import privacy_filter
class ActivityStream(RedisStore): class ActivityStream(RedisStore):
"""a category of activity stream (like home, local, federated)""" """a category of activity stream (like home, local, books)"""
def stream_id(self, user): def stream_id(self, user):
"""the redis key for this user's instance of this stream""" """the redis key for this user's instance of this stream"""
@ -155,29 +156,60 @@ class LocalStream(ActivityStream):
) )
class FederatedStream(ActivityStream): class BooksStream(ActivityStream):
"""users you follow""" """books on your shelves"""
key = "federated" key = "books"
def get_audience(self, status): def get_audience(self, status):
# this stream wants no part in non-public statuses """anyone with the mentioned book on their shelves"""
if status.privacy != "public": # only show public statuses on the books feed,
# and only statuses that mention books
if status.privacy != "public" or not (
status.mention_books.exists() or hasattr(status, "book")
):
return [] return []
return super().get_audience(status)
work = (
status.book.parent_work
if hasattr(status, "book")
else status.mention_books.first().parent_work
)
audience = super().get_audience(status)
if not audience:
return []
return audience.filter(shelfbook__book__parent_work=work).distinct()
def get_statuses_for_user(self, user): def get_statuses_for_user(self, user):
"""any public status that mentions the user's books"""
books = user.shelfbook_set.values_list(
"book__parent_work__id", flat=True
).distinct()
return privacy_filter( return privacy_filter(
user, user,
models.Status.objects.select_subclasses(), models.Status.objects.select_subclasses()
.filter(
Q(comment__book__parent_work__id__in=books)
| Q(quotation__book__parent_work__id__in=books)
| Q(review__book__parent_work__id__in=books)
| Q(mention_books__parent_work__id__in=books)
)
.distinct(),
privacy_levels=["public"], privacy_levels=["public"],
) )
# determine which streams are enabled in settings.py
available_streams = [s["key"] for s in STREAMS]
streams = { streams = {
"home": HomeStream(), k: v
"local": LocalStream(), for (k, v) in {
"federated": FederatedStream(), "home": HomeStream(),
"local": LocalStream(),
"books": BooksStream(),
}.items()
if k in available_streams
} }
@ -197,7 +229,6 @@ def add_status_on_create(sender, instance, created, *args, **kwargs):
if not created: if not created:
return return
# iterates through Home, Local, Federated
for stream in streams.values(): for stream in streams.values():
stream.add_status(instance) stream.add_status(instance)
@ -264,7 +295,7 @@ def remove_statuses_on_block(sender, instance, *args, **kwargs):
# pylint: disable=unused-argument # pylint: disable=unused-argument
def add_statuses_on_unblock(sender, instance, *args, **kwargs): def add_statuses_on_unblock(sender, instance, *args, **kwargs):
"""remove statuses from all feeds on block""" """remove statuses from all feeds on block"""
public_streams = [LocalStream(), FederatedStream()] public_streams = [v for (k, v) in streams.items() if k != "home"]
# add statuses back to streams with statuses from anyone # add statuses back to streams with statuses from anyone
if instance.user_subject.local: if instance.user_subject.local:
for stream in public_streams: for stream in public_streams:

View file

@ -0,0 +1,17 @@
# Generated by Django 3.2.4 on 2021-08-05 00:00
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0079_merge_20210804_1746"),
]
operations = [
migrations.AlterModelOptions(
name="shelfbook",
options={"ordering": ("-shelved_date", "-created_date", "-updated_date")},
),
]

View file

@ -118,7 +118,11 @@ REDIS_ACTIVITY_PORT = env("REDIS_ACTIVITY_PORT", 6379)
REDIS_ACTIVITY_PASSWORD = env("REDIS_ACTIVITY_PASSWORD", None) REDIS_ACTIVITY_PASSWORD = env("REDIS_ACTIVITY_PASSWORD", None)
MAX_STREAM_LENGTH = int(env("MAX_STREAM_LENGTH", 200)) MAX_STREAM_LENGTH = int(env("MAX_STREAM_LENGTH", 200))
STREAMS = ["home", "local", "federated"]
STREAMS = [
{"key": "home", "name": _("Home Timeline"), "shortname": _("Home")},
{"key": "books", "name": _("Books Timeline"), "shortname": _("Books")},
]
# Database # Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases # https://docs.djangoproject.com/en/3.2/ref/settings/#databases

View file

@ -4,35 +4,25 @@
{% block panel %} {% block panel %}
<h1 class="title"> <h1 class="title">
{% if tab == 'home' %} {{ tab.name }}
{% trans "Home Timeline" %}
{% elif tab == 'local' %}
{% trans "Local Timeline" %}
{% else %}
{% trans "Federated Timeline" %}
{% endif %}
</h1> </h1>
<div class="tabs"> <div class="tabs">
<ul> <ul>
<li class="{% if tab == 'home' %}is-active{% endif %}"{% if tab == 'home' %} aria-current="page"{% endif %}> {% for stream in streams %}
<a href="/#feed">{% trans "Home" %}</a> <li class="{% if tab.key == stream.key %}is-active{% endif %}"{% if tab.key == stream.key %} aria-current="page"{% endif %}>
</li> <a href="/{{ stream.key }}#feed">{{ stream.shortname }}</a>
<li class="{% if tab == 'local' %}is-active{% endif %}"{% if tab == 'local' %} aria-current="page"{% endif %}>
<a href="/local#feed">{% trans "Local" %}</a>
</li>
<li class="{% if tab == 'federated' %}is-active{% endif %}"{% if tab == 'federated' %} aria-current="page"{% endif %}>
<a href="/federated#feed">{% trans "Federated" %}</a>
</li> </li>
{% endfor %}
</ul> </ul>
</div> </div>
{# announcements and system messages #} {# announcements and system messages #}
{% if not activities.number > 1 %} {% if not activities.number > 1 %}
<a href="{{ request.path }}" class="transition-y is-hidden notification is-primary is-block" data-poll-wrapper> <a href="{{ request.path }}" class="transition-y is-hidden notification is-primary is-block" data-poll-wrapper>
{% blocktrans %}load <span data-poll="stream/{{ tab }}">0</span> unread status(es){% endblocktrans %} {% blocktrans %}load <span data-poll="stream/{{ tab.key }}">0</span> unread status(es){% endblocktrans %}
</a> </a>
{% if request.user.show_goal and not goal and tab == 'home' %} {% if request.user.show_goal and not goal and tab.key == streams.first.key %}
{% now 'Y' as year %} {% now 'Y' as year %}
<section class="block"> <section class="block">
{% include 'snippets/goal_card.html' with year=year %} {% include 'snippets/goal_card.html' with year=year %}

View file

@ -46,4 +46,4 @@ class Activitystreams(TestCase):
"bookwyrm.activitystreams.ActivityStream.populate_store" "bookwyrm.activitystreams.ActivityStream.populate_store"
) as redis_mock: ) as redis_mock:
populate_streams() populate_streams()
self.assertEqual(redis_mock.call_count, 6) # 2 users x 3 streams self.assertEqual(redis_mock.call_count, 4) # 2 users x 2 streams

View file

@ -6,6 +6,7 @@ from bookwyrm import activitystreams, models
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
@patch("bookwyrm.activitystreams.ActivityStream.add_status") @patch("bookwyrm.activitystreams.ActivityStream.add_status")
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
class Activitystreams(TestCase): class Activitystreams(TestCase):
"""using redis to build activity streams""" """using redis to build activity streams"""
@ -32,7 +33,8 @@ class Activitystreams(TestCase):
inbox="https://example.com/users/rat/inbox", inbox="https://example.com/users/rat/inbox",
outbox="https://example.com/users/rat/outbox", outbox="https://example.com/users/rat/outbox",
) )
self.book = models.Edition.objects.create(title="test book") work = models.Work.objects.create(title="test work")
self.book = models.Edition.objects.create(title="test book", parent_work=work)
class TestStream(activitystreams.ActivityStream): class TestStream(activitystreams.ActivityStream):
"""test stream, don't have to do anything here""" """test stream, don't have to do anything here"""
@ -191,19 +193,95 @@ class Activitystreams(TestCase):
users = activitystreams.LocalStream().get_audience(status) users = activitystreams.LocalStream().get_audience(status)
self.assertEqual(users, []) self.assertEqual(users, [])
def test_federatedstream_get_audience(self, *_): def test_localstream_get_audience_books_no_book(self, *_):
"""get a list of users that should see a status""" """get a list of users that should see a status"""
status = models.Status.objects.create( status = models.Status.objects.create(
user=self.remote_user, content="hi", privacy="public" user=self.local_user, content="hi", privacy="public"
) )
users = activitystreams.FederatedStream().get_audience(status) audience = activitystreams.BooksStream().get_audience(status)
self.assertTrue(self.local_user in users) # no books, no audience
self.assertTrue(self.another_user in users) self.assertEqual(audience, [])
def test_federatedstream_get_audience_unlisted(self, *_): def test_localstream_get_audience_books_mention_books(self, *_):
"""get a list of users that should see a status""" """get a list of users that should see a status"""
status = models.Status.objects.create( status = models.Status.objects.create(
user=self.remote_user, content="hi", privacy="unlisted" user=self.local_user, content="hi", privacy="public"
) )
users = activitystreams.FederatedStream().get_audience(status) status.mention_books.add(self.book)
self.assertEqual(users, []) 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])

View file

@ -45,7 +45,7 @@ class FeedViews(TestCase):
view = views.Feed.as_view() view = views.Feed.as_view()
request = self.factory.get("") request = self.factory.get("")
request.user = self.local_user request.user = self.local_user
result = view(request, "local") result = view(request, "home")
self.assertIsInstance(result, TemplateResponse) self.assertIsInstance(result, TemplateResponse)
result.render() result.render()
self.assertEqual(result.status_code, 200) self.assertEqual(result.status_code, 200)

View file

@ -23,6 +23,8 @@ STATUS_PATH = r"%s/(%s)/(?P<status_id>\d+)" % (USER_PATH, "|".join(status_types)
BOOK_PATH = r"^book/(?P<book_id>\d+)" BOOK_PATH = r"^book/(?P<book_id>\d+)"
STREAMS = "|".join(s["key"] for s in settings.STREAMS)
urlpatterns = [ urlpatterns = [
path("admin/", admin.site.urls), path("admin/", admin.site.urls),
path( path(
@ -177,7 +179,7 @@ urlpatterns = [
name="get-started-users", name="get-started-users",
), ),
# feeds # feeds
re_path(r"^(?P<tab>home|local|federated)/?$", views.Feed.as_view()), re_path(r"^(?P<tab>{:s})/?$".format(STREAMS), views.Feed.as_view()),
re_path( re_path(
r"^direct-messages/?$", views.DirectMessage.as_view(), name="direct-messages" r"^direct-messages/?$", views.DirectMessage.as_view(), name="direct-messages"
), ),

View file

@ -23,10 +23,12 @@ class Feed(View):
def get(self, request, tab): def get(self, request, tab):
"""user's homepage with activity feed""" """user's homepage with activity feed"""
if not tab in STREAMS: tab = [s for s in STREAMS if s["key"] == tab]
tab = "home" tab = tab[0] if tab else STREAMS[0]
activities = activitystreams.streams[tab].get_activity_stream(request.user) activities = activitystreams.streams[tab["key"]].get_activity_stream(
request.user
)
paginated = Paginator(activities, PAGE_LENGTH) paginated = Paginator(activities, PAGE_LENGTH)
suggestions = suggested_users.get_suggestions(request.user) suggestions = suggested_users.get_suggestions(request.user)
@ -38,8 +40,9 @@ class Feed(View):
"activities": paginated.get_page(request.GET.get("page")), "activities": paginated.get_page(request.GET.get("page")),
"suggested_users": suggestions, "suggested_users": suggestions,
"tab": tab, "tab": tab,
"streams": STREAMS,
"goal_form": forms.GoalForm(), "goal_form": forms.GoalForm(),
"path": "/%s" % tab, "path": "/%s" % tab["key"],
}, },
} }
return TemplateResponse(request, "feed/feed.html", data) return TemplateResponse(request, "feed/feed.html", data)

Binary file not shown.

View file

@ -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-08-04 20:40+0000\n" "POT-Creation-Date: 2021-08-05 01:33+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"
@ -101,27 +101,49 @@ 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:166 #: bookwyrm/settings.py:123
msgid "Home Timeline"
msgstr ""
#: bookwyrm/settings.py:123
msgid "Home"
msgstr ""
#: bookwyrm/settings.py:124
#, fuzzy
#| msgid "Title"
msgid "Books Timeline"
msgstr "Titel"
#: bookwyrm/settings.py:124 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:81
#, fuzzy
#| msgid "Book"
msgid "Books"
msgstr "Buch"
#: bookwyrm/settings.py:170
msgid "English" msgid "English"
msgstr "Englisch" msgstr "Englisch"
#: bookwyrm/settings.py:167 #: bookwyrm/settings.py:171
msgid "German" msgid "German"
msgstr "Deutsch" msgstr "Deutsch"
#: bookwyrm/settings.py:168 #: bookwyrm/settings.py:172
msgid "Spanish" msgid "Spanish"
msgstr "Spanisch" msgstr "Spanisch"
#: bookwyrm/settings.py:169 #: bookwyrm/settings.py:173
msgid "French" msgid "French"
msgstr "Französisch" msgstr "Französisch"
#: bookwyrm/settings.py:170 #: bookwyrm/settings.py:174
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "Vereinfachtes Chinesisch" msgstr "Vereinfachtes Chinesisch"
#: bookwyrm/settings.py:171 #: bookwyrm/settings.py:175
msgid "Traditional Chinese" msgid "Traditional Chinese"
msgstr "" msgstr ""
@ -972,39 +994,12 @@ msgstr "Alle Nachrichten"
msgid "You have no messages right now." msgid "You have no messages right now."
msgstr "Du hast momentan keine Nachrichten." msgstr "Du hast momentan keine Nachrichten."
#: bookwyrm/templates/feed/feed.html:8 #: bookwyrm/templates/feed/feed.html:22
msgid "Home Timeline"
msgstr ""
#: bookwyrm/templates/feed/feed.html:10
msgid "Local Timeline"
msgstr ""
#: bookwyrm/templates/feed/feed.html:12
#, fuzzy
#| msgid "Federated Servers"
msgid "Federated Timeline"
msgstr "Föderierende Server"
#: bookwyrm/templates/feed/feed.html:18
msgid "Home"
msgstr ""
#: bookwyrm/templates/feed/feed.html:21
msgid "Local"
msgstr "Lokal"
#: bookwyrm/templates/feed/feed.html:24
#: bookwyrm/templates/settings/edit_server.html:40
msgid "Federated"
msgstr "Föderiert"
#: bookwyrm/templates/feed/feed.html:32
#, python-format #, python-format
msgid "load <span data-poll=\"stream/%(tab)s\">0</span> unread status(es)" msgid "load <span data-poll=\"stream/%(tab.key)s\">0</span> unread status(es)"
msgstr "" msgstr ""
#: bookwyrm/templates/feed/feed.html:48 #: bookwyrm/templates/feed/feed.html:38
msgid "There aren't any activities right now! Try following a user to get started" msgid "There aren't any activities right now! Try following a user to get started"
msgstr "Hier sind noch keine Aktivitäten! Folge anderen, um loszulegen" msgstr "Hier sind noch keine Aktivitäten! Folge anderen, um loszulegen"
@ -2020,14 +2015,6 @@ msgstr "Suche nach Buch oder Benutzer*in"
msgid "Search type" msgid "Search type"
msgstr "Suche" msgstr "Suche"
#: bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:81
#, fuzzy
#| msgid "Book"
msgid "Books"
msgstr "Buch"
#: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:23
#: bookwyrm/templates/search/layout.html:46 #: bookwyrm/templates/search/layout.html:46
#: bookwyrm/templates/settings/admin_layout.html:26 #: bookwyrm/templates/settings/admin_layout.html:26
@ -2242,6 +2229,10 @@ msgstr "Instanzname"
msgid "Status:" msgid "Status:"
msgstr "Importstatus" msgstr "Importstatus"
#: bookwyrm/templates/settings/edit_server.html:40
msgid "Federated"
msgstr "Föderiert"
#: bookwyrm/templates/settings/edit_server.html:41 #: bookwyrm/templates/settings/edit_server.html:41
#: bookwyrm/templates/settings/federated_server.html:10 #: bookwyrm/templates/settings/federated_server.html:10
#, fuzzy #, fuzzy
@ -2573,15 +2564,23 @@ msgstr "Registrierungen geschlossen text"
msgid "Posted by <a href=\"%(user_path)s\">%(username)s</a>" msgid "Posted by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "Direktnachrichten mit <a href=\"%(path)s\">%(username)s</a>" msgstr "Direktnachrichten mit <a href=\"%(path)s\">%(username)s</a>"
#: bookwyrm/templates/snippets/authors.html:22
#, python-format
msgid "and %(remainder_count_display)s other"
msgid_plural "and %(remainder_count_display)s others"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/snippets/book_cover.html:32 #: bookwyrm/templates/snippets/book_cover.html:32
#, fuzzy #, fuzzy
#| msgid "Add cover" #| msgid "Add cover"
msgid "No cover" msgid "No cover"
msgstr "Cover hinzufügen" msgstr "Cover hinzufügen"
#: bookwyrm/templates/snippets/book_titleby.html:4 #: bookwyrm/templates/snippets/book_titleby.html:6
#, python-format #, fuzzy, python-format
msgid "<a href=\"%(path)s\">%(title)s</a> by " #| msgid "<a href=\"%(path)s\">%(title)s</a> by "
msgid "<a href=\"%(path)s\">%(title)s</a> by"
msgstr "<a href=\"%(path)s\">%(title)s</a> von " msgstr "<a href=\"%(path)s\">%(title)s</a> von "
#: bookwyrm/templates/snippets/boost_button.html:20 #: bookwyrm/templates/snippets/boost_button.html:20
@ -3313,6 +3312,14 @@ msgstr "Dieser Benutzename ist bereits vergeben."
msgid "A password reset link sent to %s" msgid "A password reset link sent to %s"
msgstr "" msgstr ""
#, fuzzy
#~| msgid "Federated Servers"
#~ msgid "Federated Timeline"
#~ msgstr "Föderierende Server"
#~ msgid "Local"
#~ msgstr "Lokal"
#, fuzzy #, fuzzy
#~| msgid "Direct Messages with <a href=\"%(path)s\">%(username)s</a>" #~| msgid "Direct Messages with <a href=\"%(path)s\">%(username)s</a>"
#~ msgid "Remove <a href=\"%(path)s\">%(name)s</a>" #~ msgid "Remove <a href=\"%(path)s\">%(name)s</a>"

View file

@ -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-08-04 20:40+0000\n" "POT-Creation-Date: 2021-08-05 01:33+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"
@ -91,27 +91,45 @@ msgstr ""
msgid "A user with that username already exists." msgid "A user with that username already exists."
msgstr "" msgstr ""
#: bookwyrm/settings.py:166 #: bookwyrm/settings.py:123
msgid "English" msgid "Home Timeline"
msgstr "" msgstr ""
#: bookwyrm/settings.py:167 #: bookwyrm/settings.py:123
msgid "German" msgid "Home"
msgstr "" msgstr ""
#: bookwyrm/settings.py:168 #: bookwyrm/settings.py:124
msgid "Spanish" msgid "Books Timeline"
msgstr "" msgstr ""
#: bookwyrm/settings.py:169 #: bookwyrm/settings.py:124 bookwyrm/templates/search/layout.html:21
msgid "French" #: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:81
msgid "Books"
msgstr "" msgstr ""
#: bookwyrm/settings.py:170 #: bookwyrm/settings.py:170
msgid "Simplified Chinese" msgid "English"
msgstr "" msgstr ""
#: bookwyrm/settings.py:171 #: bookwyrm/settings.py:171
msgid "German"
msgstr ""
#: bookwyrm/settings.py:172
msgid "Spanish"
msgstr ""
#: bookwyrm/settings.py:173
msgid "French"
msgstr ""
#: bookwyrm/settings.py:174
msgid "Simplified Chinese"
msgstr ""
#: bookwyrm/settings.py:175
msgid "Traditional Chinese" msgid "Traditional Chinese"
msgstr "" msgstr ""
@ -896,37 +914,12 @@ msgstr ""
msgid "You have no messages right now." msgid "You have no messages right now."
msgstr "" msgstr ""
#: bookwyrm/templates/feed/feed.html:8 #: bookwyrm/templates/feed/feed.html:22
msgid "Home Timeline"
msgstr ""
#: bookwyrm/templates/feed/feed.html:10
msgid "Local Timeline"
msgstr ""
#: bookwyrm/templates/feed/feed.html:12
msgid "Federated Timeline"
msgstr ""
#: bookwyrm/templates/feed/feed.html:18
msgid "Home"
msgstr ""
#: bookwyrm/templates/feed/feed.html:21
msgid "Local"
msgstr ""
#: bookwyrm/templates/feed/feed.html:24
#: bookwyrm/templates/settings/edit_server.html:40
msgid "Federated"
msgstr ""
#: bookwyrm/templates/feed/feed.html:32
#, python-format #, python-format
msgid "load <span data-poll=\"stream/%(tab)s\">0</span> unread status(es)" msgid "load <span data-poll=\"stream/%(tab.key)s\">0</span> unread status(es)"
msgstr "" msgstr ""
#: bookwyrm/templates/feed/feed.html:48 #: bookwyrm/templates/feed/feed.html:38
msgid "There aren't any activities right now! Try following a user to get started" msgid "There aren't any activities right now! Try following a user to get started"
msgstr "" msgstr ""
@ -1864,12 +1857,6 @@ msgstr ""
msgid "Search type" msgid "Search type"
msgstr "" msgstr ""
#: bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:81
msgid "Books"
msgstr ""
#: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:23
#: bookwyrm/templates/search/layout.html:46 #: bookwyrm/templates/search/layout.html:46
#: bookwyrm/templates/settings/admin_layout.html:26 #: bookwyrm/templates/settings/admin_layout.html:26
@ -2045,6 +2032,10 @@ msgstr ""
msgid "Status:" msgid "Status:"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/edit_server.html:40
msgid "Federated"
msgstr ""
#: bookwyrm/templates/settings/edit_server.html:41 #: bookwyrm/templates/settings/edit_server.html:41
#: bookwyrm/templates/settings/federated_server.html:10 #: bookwyrm/templates/settings/federated_server.html:10
msgid "Blocked" msgid "Blocked"
@ -2333,13 +2324,20 @@ msgstr ""
msgid "Posted by <a href=\"%(user_path)s\">%(username)s</a>" msgid "Posted by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "" msgstr ""
#: bookwyrm/templates/snippets/authors.html:22
#, python-format
msgid "and %(remainder_count_display)s other"
msgid_plural "and %(remainder_count_display)s others"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/snippets/book_cover.html:32 #: bookwyrm/templates/snippets/book_cover.html:32
msgid "No cover" msgid "No cover"
msgstr "" msgstr ""
#: bookwyrm/templates/snippets/book_titleby.html:4 #: bookwyrm/templates/snippets/book_titleby.html:6
#, python-format #, python-format
msgid "<a href=\"%(path)s\">%(title)s</a> by " msgid "<a href=\"%(path)s\">%(title)s</a> by"
msgstr "" msgstr ""
#: bookwyrm/templates/snippets/boost_button.html:20 #: bookwyrm/templates/snippets/boost_button.html:20

Binary file not shown.

View file

@ -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-08-04 20:40+0000\n" "POT-Creation-Date: 2021-08-05 01:33+0000\n"
"PO-Revision-Date: 2021-03-19 11:49+0800\n" "PO-Revision-Date: 2021-03-19 11:49+0800\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -91,27 +91,47 @@ 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:166 #: bookwyrm/settings.py:123
msgid "Home Timeline"
msgstr "Línea temporal de hogar"
#: bookwyrm/settings.py:123
msgid "Home"
msgstr "Hogar"
#: bookwyrm/settings.py:124
#, fuzzy
#| msgid "Book Title"
msgid "Books Timeline"
msgstr "Título"
#: bookwyrm/settings.py:124 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:81
msgid "Books"
msgstr "Libros"
#: bookwyrm/settings.py:170
msgid "English" msgid "English"
msgstr "Inglés" msgstr "Inglés"
#: bookwyrm/settings.py:167 #: bookwyrm/settings.py:171
msgid "German" msgid "German"
msgstr "Aléman" msgstr "Aléman"
#: bookwyrm/settings.py:168 #: bookwyrm/settings.py:172
msgid "Spanish" msgid "Spanish"
msgstr "Español" msgstr "Español"
#: bookwyrm/settings.py:169 #: bookwyrm/settings.py:173
msgid "French" msgid "French"
msgstr "Francés" msgstr "Francés"
#: bookwyrm/settings.py:170 #: bookwyrm/settings.py:174
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "Chino simplificado" msgstr "Chino simplificado"
#: bookwyrm/settings.py:171 #: bookwyrm/settings.py:175
#, fuzzy #, fuzzy
#| msgid "Additional info:" #| msgid "Additional info:"
msgid "Traditional Chinese" msgid "Traditional Chinese"
@ -904,37 +924,13 @@ msgstr "Todos los mensajes"
msgid "You have no messages right now." msgid "You have no messages right now."
msgstr "No tienes ningún mensaje en este momento." msgstr "No tienes ningún mensaje en este momento."
#: bookwyrm/templates/feed/feed.html:8 #: bookwyrm/templates/feed/feed.html:22
msgid "Home Timeline" #, fuzzy, python-format
msgstr "Línea temporal de hogar" #| msgid "load <span data-poll=\"stream/%(tab)s\">0</span> unread status(es)"
msgid "load <span data-poll=\"stream/%(tab.key)s\">0</span> unread status(es)"
#: bookwyrm/templates/feed/feed.html:10
msgid "Local Timeline"
msgstr "Línea temporal local"
#: bookwyrm/templates/feed/feed.html:12
msgid "Federated Timeline"
msgstr "Línea temporal federalizado"
#: bookwyrm/templates/feed/feed.html:18
msgid "Home"
msgstr "Hogar"
#: bookwyrm/templates/feed/feed.html:21
msgid "Local"
msgstr "Local"
#: bookwyrm/templates/feed/feed.html:24
#: bookwyrm/templates/settings/edit_server.html:40
msgid "Federated"
msgstr "Federalizado"
#: bookwyrm/templates/feed/feed.html:32
#, python-format
msgid "load <span data-poll=\"stream/%(tab)s\">0</span> unread status(es)"
msgstr "cargar <span data-poll=\"stream/%(tab)s\">0</span> status(es) no leídos" msgstr "cargar <span data-poll=\"stream/%(tab)s\">0</span> status(es) no leídos"
#: bookwyrm/templates/feed/feed.html:48 #: bookwyrm/templates/feed/feed.html:38
msgid "There aren't any activities right now! Try following a user to get started" msgid "There aren't any activities right now! Try following a user to get started"
msgstr "¡No hay actividad ahora mismo! Sigue a otro usuario para empezar" msgstr "¡No hay actividad ahora mismo! Sigue a otro usuario para empezar"
@ -1885,12 +1881,6 @@ msgstr "Búsqueda"
msgid "Search type" msgid "Search type"
msgstr "Tipo de búsqueda" msgstr "Tipo de búsqueda"
#: bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:81
msgid "Books"
msgstr "Libros"
#: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:23
#: bookwyrm/templates/search/layout.html:46 #: bookwyrm/templates/search/layout.html:46
#: bookwyrm/templates/settings/admin_layout.html:26 #: bookwyrm/templates/settings/admin_layout.html:26
@ -2072,6 +2062,10 @@ msgstr "Instancia:"
msgid "Status:" msgid "Status:"
msgstr "Status:" msgstr "Status:"
#: bookwyrm/templates/settings/edit_server.html:40
msgid "Federated"
msgstr "Federalizado"
#: bookwyrm/templates/settings/edit_server.html:41 #: bookwyrm/templates/settings/edit_server.html:41
#: bookwyrm/templates/settings/federated_server.html:10 #: bookwyrm/templates/settings/federated_server.html:10
msgid "Blocked" msgid "Blocked"
@ -2366,13 +2360,21 @@ msgstr "Texto de registración cerrada:"
msgid "Posted by <a href=\"%(user_path)s\">%(username)s</a>" msgid "Posted by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "Publicado por <a href=\"%(user_path)s\">%(username)s</a>" msgstr "Publicado por <a href=\"%(user_path)s\">%(username)s</a>"
#: bookwyrm/templates/snippets/authors.html:22
#, python-format
msgid "and %(remainder_count_display)s other"
msgid_plural "and %(remainder_count_display)s others"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/snippets/book_cover.html:32 #: bookwyrm/templates/snippets/book_cover.html:32
msgid "No cover" msgid "No cover"
msgstr "Sin portada" msgstr "Sin portada"
#: bookwyrm/templates/snippets/book_titleby.html:4 #: bookwyrm/templates/snippets/book_titleby.html:6
#, python-format #, fuzzy, python-format
msgid "<a href=\"%(path)s\">%(title)s</a> by " #| msgid "<a href=\"%(path)s\">%(title)s</a> by "
msgid "<a href=\"%(path)s\">%(title)s</a> by"
msgstr "<a href=\"%(path)s\">%(title)s</a> por " msgstr "<a href=\"%(path)s\">%(title)s</a> por "
#: bookwyrm/templates/snippets/boost_button.html:20 #: bookwyrm/templates/snippets/boost_button.html:20
@ -3047,6 +3049,15 @@ msgstr "No se pudo encontrar un usuario con esa dirección de correo electrónic
msgid "A password reset link sent to %s" msgid "A password reset link sent to %s"
msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" msgstr "Un enlace para reestablecer tu contraseña se enviará a %s"
#~ msgid "Local Timeline"
#~ msgstr "Línea temporal local"
#~ msgid "Federated Timeline"
#~ msgstr "Línea temporal federalizado"
#~ msgid "Local"
#~ msgstr "Local"
#~ msgid "Remove <a href=\"%(path)s\">%(name)s</a>" #~ msgid "Remove <a href=\"%(path)s\">%(name)s</a>"
#~ msgstr "Eliminar <a href=\"%(path)s\">%(name)s</a>" #~ msgstr "Eliminar <a href=\"%(path)s\">%(name)s</a>"

Binary file not shown.

View file

@ -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-08-04 20:40+0000\n" "POT-Creation-Date: 2021-08-05 01:33+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"
@ -91,27 +91,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:166 #: bookwyrm/settings.py:123
msgid "Home Timeline"
msgstr "Mon fil dactualité"
#: bookwyrm/settings.py:123
msgid "Home"
msgstr "Accueil"
#: bookwyrm/settings.py:124
#, fuzzy
#| msgid "Book Title"
msgid "Books Timeline"
msgstr "Titre du livre"
#: bookwyrm/settings.py:124 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:81
msgid "Books"
msgstr "Livres"
#: bookwyrm/settings.py:170
msgid "English" msgid "English"
msgstr "English" msgstr "English"
#: bookwyrm/settings.py:167 #: bookwyrm/settings.py:171
msgid "German" msgid "German"
msgstr "Deutsch" msgstr "Deutsch"
#: bookwyrm/settings.py:168 #: bookwyrm/settings.py:172
msgid "Spanish" msgid "Spanish"
msgstr "Español" msgstr "Español"
#: bookwyrm/settings.py:169 #: bookwyrm/settings.py:173
msgid "French" msgid "French"
msgstr "Français" msgstr "Français"
#: bookwyrm/settings.py:170 #: bookwyrm/settings.py:174
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "简化字" msgstr "简化字"
#: bookwyrm/settings.py:171 #: bookwyrm/settings.py:175
#, fuzzy #, fuzzy
#| msgid "Additional info:" #| msgid "Additional info:"
msgid "Traditional Chinese" msgid "Traditional Chinese"
@ -900,37 +920,13 @@ msgstr "Tous les messages"
msgid "You have no messages right now." msgid "You have no messages right now."
msgstr "Vous navez aucun message pour linstant." msgstr "Vous navez aucun message pour linstant."
#: bookwyrm/templates/feed/feed.html:8 #: bookwyrm/templates/feed/feed.html:22
msgid "Home Timeline" #, fuzzy, python-format
msgstr "Mon fil dactualité" #| msgid "load <span data-poll=\"stream/%(tab)s\">0</span> unread status(es)"
msgid "load <span data-poll=\"stream/%(tab.key)s\">0</span> unread status(es)"
#: bookwyrm/templates/feed/feed.html:10
msgid "Local Timeline"
msgstr "Fil dactualité local"
#: bookwyrm/templates/feed/feed.html:12
msgid "Federated Timeline"
msgstr "Fil dactualité des instances fédérées"
#: bookwyrm/templates/feed/feed.html:18
msgid "Home"
msgstr "Accueil"
#: bookwyrm/templates/feed/feed.html:21
msgid "Local"
msgstr "Local"
#: bookwyrm/templates/feed/feed.html:24
#: bookwyrm/templates/settings/edit_server.html:40
msgid "Federated"
msgstr "Fédéré"
#: bookwyrm/templates/feed/feed.html:32
#, python-format
msgid "load <span data-poll=\"stream/%(tab)s\">0</span> unread status(es)"
msgstr "charger le(s) <span data-poll=\"stream/%(tab)s\">0</span> statut(s) non lu(s)" msgstr "charger le(s) <span data-poll=\"stream/%(tab)s\">0</span> statut(s) non lu(s)"
#: bookwyrm/templates/feed/feed.html:48 #: bookwyrm/templates/feed/feed.html:38
msgid "There aren't any activities right now! Try following a user to get started" msgid "There aren't any activities right now! Try following a user to get started"
msgstr "Aucune activité pour linstant! Abonnezvous à quelquun pour commencer" msgstr "Aucune activité pour linstant! Abonnezvous à quelquun pour commencer"
@ -1879,12 +1875,6 @@ msgstr "Requête"
msgid "Search type" msgid "Search type"
msgstr "Type de recherche" msgstr "Type de recherche"
#: bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:81
msgid "Books"
msgstr "Livres"
#: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:23
#: bookwyrm/templates/search/layout.html:46 #: bookwyrm/templates/search/layout.html:46
#: bookwyrm/templates/settings/admin_layout.html:26 #: bookwyrm/templates/settings/admin_layout.html:26
@ -2060,6 +2050,10 @@ msgstr "Instance:"
msgid "Status:" msgid "Status:"
msgstr "Statut:" msgstr "Statut:"
#: bookwyrm/templates/settings/edit_server.html:40
msgid "Federated"
msgstr "Fédéré"
#: bookwyrm/templates/settings/edit_server.html:41 #: bookwyrm/templates/settings/edit_server.html:41
#: bookwyrm/templates/settings/federated_server.html:10 #: bookwyrm/templates/settings/federated_server.html:10
msgid "Blocked" msgid "Blocked"
@ -2348,13 +2342,21 @@ msgstr "Texte affiché lorsque les inscriptions sont closes:"
msgid "Posted by <a href=\"%(user_path)s\">%(username)s</a>" msgid "Posted by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "Publiée par <a href=\"%(user_path)s\">%(username)s</a>" msgstr "Publiée par <a href=\"%(user_path)s\">%(username)s</a>"
#: bookwyrm/templates/snippets/authors.html:22
#, python-format
msgid "and %(remainder_count_display)s other"
msgid_plural "and %(remainder_count_display)s others"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/snippets/book_cover.html:32 #: bookwyrm/templates/snippets/book_cover.html:32
msgid "No cover" msgid "No cover"
msgstr "Pas de couverture" msgstr "Pas de couverture"
#: bookwyrm/templates/snippets/book_titleby.html:4 #: bookwyrm/templates/snippets/book_titleby.html:6
#, python-format #, fuzzy, python-format
msgid "<a href=\"%(path)s\">%(title)s</a> by " #| msgid "<a href=\"%(path)s\">%(title)s</a> by "
msgid "<a href=\"%(path)s\">%(title)s</a> by"
msgstr "<a href=\"%(path)s\">%(title)s</a> par " msgstr "<a href=\"%(path)s\">%(title)s</a> par "
#: bookwyrm/templates/snippets/boost_button.html:20 #: bookwyrm/templates/snippets/boost_button.html:20
@ -3026,6 +3028,15 @@ msgstr "Aucun compte avec cette adresse email na été trouvé."
msgid "A password reset link sent to %s" msgid "A password reset link sent to %s"
msgstr "Un lien de réinitialisation a été envoyé à %s." msgstr "Un lien de réinitialisation a été envoyé à %s."
#~ msgid "Local Timeline"
#~ msgstr "Fil dactualité local"
#~ msgid "Federated Timeline"
#~ msgstr "Fil dactualité des instances fédérées"
#~ msgid "Local"
#~ msgstr "Local"
#, fuzzy #, fuzzy
#~| msgid "BookWyrm users" #~| msgid "BookWyrm users"
#~ msgid "BookWyrm\\" #~ msgid "BookWyrm\\"

Binary file not shown.

View file

@ -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-08-04 20:40+0000\n" "POT-Creation-Date: 2021-08-05 01:33+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"
@ -91,27 +91,47 @@ msgstr "用户名"
msgid "A user with that username already exists." msgid "A user with that username already exists."
msgstr "已经存在使用该用户名的用户。" msgstr "已经存在使用该用户名的用户。"
#: bookwyrm/settings.py:166 #: bookwyrm/settings.py:123
msgid "Home Timeline"
msgstr "主页时间线"
#: bookwyrm/settings.py:123
msgid "Home"
msgstr "主页"
#: bookwyrm/settings.py:124
#, fuzzy
#| msgid "Book Title"
msgid "Books Timeline"
msgstr "书名"
#: bookwyrm/settings.py:124 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:81
msgid "Books"
msgstr "书目"
#: bookwyrm/settings.py:170
msgid "English" msgid "English"
msgstr "English英语" msgstr "English英语"
#: bookwyrm/settings.py:167 #: bookwyrm/settings.py:171
msgid "German" msgid "German"
msgstr "Deutsch德语" msgstr "Deutsch德语"
#: bookwyrm/settings.py:168 #: bookwyrm/settings.py:172
msgid "Spanish" msgid "Spanish"
msgstr "Español西班牙语" msgstr "Español西班牙语"
#: bookwyrm/settings.py:169 #: bookwyrm/settings.py:173
msgid "French" msgid "French"
msgstr "Français法语" msgstr "Français法语"
#: bookwyrm/settings.py:170 #: bookwyrm/settings.py:174
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "简体中文" msgstr "简体中文"
#: bookwyrm/settings.py:171 #: bookwyrm/settings.py:175
msgid "Traditional Chinese" msgid "Traditional Chinese"
msgstr "繁體中文(繁体中文)" msgstr "繁體中文(繁体中文)"
@ -895,37 +915,13 @@ msgstr "所有消息"
msgid "You have no messages right now." msgid "You have no messages right now."
msgstr "你现在没有消息。" msgstr "你现在没有消息。"
#: bookwyrm/templates/feed/feed.html:8 #: bookwyrm/templates/feed/feed.html:22
msgid "Home Timeline" #, fuzzy, python-format
msgstr "主页时间线" #| msgid "load <span data-poll=\"stream/%(tab)s\">0</span> unread status(es)"
msgid "load <span data-poll=\"stream/%(tab.key)s\">0</span> unread status(es)"
#: bookwyrm/templates/feed/feed.html:10
msgid "Local Timeline"
msgstr "本地时间线"
#: bookwyrm/templates/feed/feed.html:12
msgid "Federated Timeline"
msgstr "跨站时间线"
#: bookwyrm/templates/feed/feed.html:18
msgid "Home"
msgstr "主页"
#: bookwyrm/templates/feed/feed.html:21
msgid "Local"
msgstr "本站"
#: bookwyrm/templates/feed/feed.html:24
#: bookwyrm/templates/settings/edit_server.html:40
msgid "Federated"
msgstr "跨站"
#: bookwyrm/templates/feed/feed.html:32
#, python-format
msgid "load <span data-poll=\"stream/%(tab)s\">0</span> unread status(es)"
msgstr "加载 <span data-poll=\"stream/%(tab)s\">0</span> 条未读状态" msgstr "加载 <span data-poll=\"stream/%(tab)s\">0</span> 条未读状态"
#: bookwyrm/templates/feed/feed.html:48 #: bookwyrm/templates/feed/feed.html:38
msgid "There aren't any activities right now! Try following a user to get started" msgid "There aren't any activities right now! Try following a user to get started"
msgstr "现在还没有任何活动!尝试从关注一个用户开始吧" msgstr "现在还没有任何活动!尝试从关注一个用户开始吧"
@ -1865,12 +1861,6 @@ msgstr "搜索请求"
msgid "Search type" msgid "Search type"
msgstr "搜索类型" msgstr "搜索类型"
#: bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:81
msgid "Books"
msgstr "书目"
#: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:23
#: bookwyrm/templates/search/layout.html:46 #: bookwyrm/templates/search/layout.html:46
#: bookwyrm/templates/settings/admin_layout.html:26 #: bookwyrm/templates/settings/admin_layout.html:26
@ -2046,6 +2036,10 @@ msgstr "实例:"
msgid "Status:" msgid "Status:"
msgstr "状态:" msgstr "状态:"
#: bookwyrm/templates/settings/edit_server.html:40
msgid "Federated"
msgstr "跨站"
#: bookwyrm/templates/settings/edit_server.html:41 #: bookwyrm/templates/settings/edit_server.html:41
#: bookwyrm/templates/settings/federated_server.html:10 #: bookwyrm/templates/settings/federated_server.html:10
msgid "Blocked" msgid "Blocked"
@ -2334,13 +2328,20 @@ msgstr "注册关闭文字:"
msgid "Posted by <a href=\"%(user_path)s\">%(username)s</a>" msgid "Posted by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "由 <a href=\"%(user_path)s\">%(username)s</a> 发布" msgstr "由 <a href=\"%(user_path)s\">%(username)s</a> 发布"
#: bookwyrm/templates/snippets/authors.html:22
#, python-format
msgid "and %(remainder_count_display)s other"
msgid_plural "and %(remainder_count_display)s others"
msgstr[0] ""
#: bookwyrm/templates/snippets/book_cover.html:32 #: bookwyrm/templates/snippets/book_cover.html:32
msgid "No cover" msgid "No cover"
msgstr "没有封面" msgstr "没有封面"
#: bookwyrm/templates/snippets/book_titleby.html:4 #: bookwyrm/templates/snippets/book_titleby.html:6
#, python-format #, fuzzy, python-format
msgid "<a href=\"%(path)s\">%(title)s</a> by " #| msgid "<a href=\"%(path)s\">%(title)s</a> by "
msgid "<a href=\"%(path)s\">%(title)s</a> by"
msgstr "<a href=\"%(path)s\">%(title)s</a> 来自" msgstr "<a href=\"%(path)s\">%(title)s</a> 来自"
#: bookwyrm/templates/snippets/boost_button.html:20 #: bookwyrm/templates/snippets/boost_button.html:20
@ -3003,3 +3004,12 @@ msgstr "没有找到使用该邮箱的用户。"
#, python-format #, python-format
msgid "A password reset link sent to %s" msgid "A password reset link sent to %s"
msgstr "密码重置连接已发送给 %s" msgstr "密码重置连接已发送给 %s"
#~ msgid "Local Timeline"
#~ msgstr "本地时间线"
#~ msgid "Federated Timeline"
#~ msgstr "跨站时间线"
#~ msgid "Local"
#~ msgstr "本站"

Binary file not shown.

View file

@ -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-08-04 20:40+0000\n" "POT-Creation-Date: 2021-08-05 01:33+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"
@ -91,27 +91,47 @@ msgstr "使用者名稱"
msgid "A user with that username already exists." msgid "A user with that username already exists."
msgstr "已經存在使用該名稱的使用者。" msgstr "已經存在使用該名稱的使用者。"
#: bookwyrm/settings.py:166 #: bookwyrm/settings.py:123
msgid "Home Timeline"
msgstr "主頁時間線"
#: bookwyrm/settings.py:123
msgid "Home"
msgstr "主頁"
#: bookwyrm/settings.py:124
#, fuzzy
#| msgid "Book Title"
msgid "Books Timeline"
msgstr "書名"
#: bookwyrm/settings.py:124 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:81
msgid "Books"
msgstr "書目"
#: bookwyrm/settings.py:170
msgid "English" msgid "English"
msgstr "English英語" msgstr "English英語"
#: bookwyrm/settings.py:167 #: bookwyrm/settings.py:171
msgid "German" msgid "German"
msgstr "Deutsch德語" msgstr "Deutsch德語"
#: bookwyrm/settings.py:168 #: bookwyrm/settings.py:172
msgid "Spanish" msgid "Spanish"
msgstr "Español西班牙語" msgstr "Español西班牙語"
#: bookwyrm/settings.py:169 #: bookwyrm/settings.py:173
msgid "French" msgid "French"
msgstr "Français法語" msgstr "Français法語"
#: bookwyrm/settings.py:170 #: bookwyrm/settings.py:174
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "簡體中文" msgstr "簡體中文"
#: bookwyrm/settings.py:171 #: bookwyrm/settings.py:175
#, fuzzy #, fuzzy
#| msgid "Tranditional Chinese" #| msgid "Tranditional Chinese"
msgid "Traditional Chinese" msgid "Traditional Chinese"
@ -901,37 +921,13 @@ msgstr "所有訊息"
msgid "You have no messages right now." msgid "You have no messages right now."
msgstr "你現在沒有訊息。" msgstr "你現在沒有訊息。"
#: bookwyrm/templates/feed/feed.html:8 #: bookwyrm/templates/feed/feed.html:22
msgid "Home Timeline" #, fuzzy, python-format
msgstr "主頁時間線" #| msgid "load <span data-poll=\"stream/%(tab)s\">0</span> unread status(es)"
msgid "load <span data-poll=\"stream/%(tab.key)s\">0</span> unread status(es)"
#: bookwyrm/templates/feed/feed.html:10
msgid "Local Timeline"
msgstr "本地時間線"
#: bookwyrm/templates/feed/feed.html:12
msgid "Federated Timeline"
msgstr "跨站時間線"
#: bookwyrm/templates/feed/feed.html:18
msgid "Home"
msgstr "主頁"
#: bookwyrm/templates/feed/feed.html:21
msgid "Local"
msgstr "本站"
#: bookwyrm/templates/feed/feed.html:24
#: bookwyrm/templates/settings/edit_server.html:40
msgid "Federated"
msgstr "跨站"
#: bookwyrm/templates/feed/feed.html:32
#, python-format
msgid "load <span data-poll=\"stream/%(tab)s\">0</span> unread status(es)"
msgstr "載入 <span data-poll=\"stream/%(tab)s\">0</span> 條未讀狀態" msgstr "載入 <span data-poll=\"stream/%(tab)s\">0</span> 條未讀狀態"
#: bookwyrm/templates/feed/feed.html:48 #: bookwyrm/templates/feed/feed.html:38
msgid "There aren't any activities right now! Try following a user to get started" msgid "There aren't any activities right now! Try following a user to get started"
msgstr "現在還沒有任何活動!嘗試著從關注一個使用者開始吧" msgstr "現在還沒有任何活動!嘗試著從關注一個使用者開始吧"
@ -1880,12 +1876,6 @@ msgstr "搜尋請求"
msgid "Search type" msgid "Search type"
msgstr "搜尋類別" msgstr "搜尋類別"
#: bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:81
msgid "Books"
msgstr "書目"
#: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:23
#: bookwyrm/templates/search/layout.html:46 #: bookwyrm/templates/search/layout.html:46
#: bookwyrm/templates/settings/admin_layout.html:26 #: bookwyrm/templates/settings/admin_layout.html:26
@ -2061,6 +2051,10 @@ msgstr "實例:"
msgid "Status:" msgid "Status:"
msgstr "狀態:" msgstr "狀態:"
#: bookwyrm/templates/settings/edit_server.html:40
msgid "Federated"
msgstr "跨站"
#: bookwyrm/templates/settings/edit_server.html:41 #: bookwyrm/templates/settings/edit_server.html:41
#: bookwyrm/templates/settings/federated_server.html:10 #: bookwyrm/templates/settings/federated_server.html:10
msgid "Blocked" msgid "Blocked"
@ -2353,13 +2347,20 @@ msgstr "註冊關閉文字:"
msgid "Posted by <a href=\"%(user_path)s\">%(username)s</a>" msgid "Posted by <a href=\"%(user_path)s\">%(username)s</a>"
msgstr "由 <a href=\"%(user_path)s\">%(username)s</a> 釋出" msgstr "由 <a href=\"%(user_path)s\">%(username)s</a> 釋出"
#: bookwyrm/templates/snippets/authors.html:22
#, python-format
msgid "and %(remainder_count_display)s other"
msgid_plural "and %(remainder_count_display)s others"
msgstr[0] ""
#: bookwyrm/templates/snippets/book_cover.html:32 #: bookwyrm/templates/snippets/book_cover.html:32
msgid "No cover" msgid "No cover"
msgstr "沒有封面" msgstr "沒有封面"
#: bookwyrm/templates/snippets/book_titleby.html:4 #: bookwyrm/templates/snippets/book_titleby.html:6
#, python-format #, fuzzy, python-format
msgid "<a href=\"%(path)s\">%(title)s</a> by " #| msgid "<a href=\"%(path)s\">%(title)s</a> by "
msgid "<a href=\"%(path)s\">%(title)s</a> by"
msgstr "<a href=\"%(path)s\">%(title)s</a> 來自" msgstr "<a href=\"%(path)s\">%(title)s</a> 來自"
#: bookwyrm/templates/snippets/boost_button.html:20 #: bookwyrm/templates/snippets/boost_button.html:20
@ -3023,5 +3024,14 @@ msgstr "沒有找到使用該郵箱的使用者。"
msgid "A password reset link sent to %s" msgid "A password reset link sent to %s"
msgstr "密碼重置連結已傳送給 %s" msgstr "密碼重置連結已傳送給 %s"
#~ msgid "Local Timeline"
#~ msgstr "本地時間線"
#~ msgid "Federated Timeline"
#~ msgstr "跨站時間線"
#~ msgid "Local"
#~ msgstr "本站"
#~ msgid "Remove <a href=\"%(path)s\">%(name)s</a>" #~ msgid "Remove <a href=\"%(path)s\">%(name)s</a>"
#~ msgstr "移除 <a href=\"%(path)s\">%(name)s</a>" #~ msgstr "移除 <a href=\"%(path)s\">%(name)s</a>"