From a8d6dbd8a69b06d53c89c8707f88d411ffc60120 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 4 Aug 2021 16:56:08 -0700 Subject: [PATCH 01/10] Adds books stream audience --- bookwyrm/activitystreams.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index a49a7ce4..cdfebfd0 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -173,6 +173,34 @@ class FederatedStream(ActivityStream): privacy_levels=["public"], ) +class BooksStream(ActivityStream): + """books on your shelves""" + + key = "books" + + def get_audience(self, status): + """anyone with the mentioned book on their shelves""" + # 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 [] + + 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): + """any public status that mentions their books""" + return privacy_filter( + user, + models.Status.objects.select_subclasses().filter(, + privacy_levels=["public"], + ) streams = { "home": HomeStream(), From 5a9dbc50da23f0c1a08eb1f4d7500996d30fa3d1 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 4 Aug 2021 17:25:31 -0700 Subject: [PATCH 02/10] Adds books stream --- bookwyrm/activitystreams.py | 29 +++++++++++++++---- .../0080_alter_shelfbook_options.py | 17 +++++++++++ bookwyrm/settings.py | 2 +- bookwyrm/urls.py | 4 ++- 4 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 bookwyrm/migrations/0080_alter_shelfbook_options.py diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index cdfebfd0..4e464b3c 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -173,6 +173,7 @@ class FederatedStream(ActivityStream): privacy_levels=["public"], ) + class BooksStream(ActivityStream): """books on your shelves""" @@ -182,30 +183,46 @@ class BooksStream(ActivityStream): """anyone with the mentioned book on their shelves""" # 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")): + if status.privacy != "public" or not ( + status.mention_books.exists() or hasattr(status, "book") + ): return [] - work = status.book.parent_work if hasattr(status, "book") else status.mention_books.first().parent_work + 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() + return audience.filter(shelfbook__book__parent_work=work).distinct() def get_statuses_for_user(self, user): """any public status that mentions their books""" + books = user.shelfbook_set.values_list( + "book__parent_work__id", flat=True + ).distinct() return privacy_filter( user, - models.Status.objects.select_subclasses().filter(, + 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"], ) + streams = { "home": HomeStream(), "local": LocalStream(), "federated": FederatedStream(), + "books": BooksStream(), } diff --git a/bookwyrm/migrations/0080_alter_shelfbook_options.py b/bookwyrm/migrations/0080_alter_shelfbook_options.py new file mode 100644 index 00000000..b5ee7e67 --- /dev/null +++ b/bookwyrm/migrations/0080_alter_shelfbook_options.py @@ -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")}, + ), + ] diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index 17fcfabe..a10f128d 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -118,7 +118,7 @@ REDIS_ACTIVITY_PORT = env("REDIS_ACTIVITY_PORT", 6379) REDIS_ACTIVITY_PASSWORD = env("REDIS_ACTIVITY_PASSWORD", None) MAX_STREAM_LENGTH = int(env("MAX_STREAM_LENGTH", 200)) -STREAMS = ["home", "local", "federated"] +STREAMS = ["home", "books"] # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 7eccfd65..3d39b9d5 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -23,6 +23,8 @@ STATUS_PATH = r"%s/(%s)/(?P\d+)" % (USER_PATH, "|".join(status_types) BOOK_PATH = r"^book/(?P\d+)" +STREAMS = "|".join(settings.STREAMS) + urlpatterns = [ path("admin/", admin.site.urls), path( @@ -177,7 +179,7 @@ urlpatterns = [ name="get-started-users", ), # feeds - re_path(r"^(?Phome|local|federated)/?$", views.Feed.as_view()), + re_path(r"^(?P{:s})/?$".format(STREAMS), views.Feed.as_view()), re_path( r"^direct-messages/?$", views.DirectMessage.as_view(), name="direct-messages" ), From 9d75bc39827d94319d50519e57890c03a677cb11 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 4 Aug 2021 17:53:44 -0700 Subject: [PATCH 03/10] Display books timeline --- bookwyrm/activitystreams.py | 8 ++++---- bookwyrm/settings.py | 6 +++++- bookwyrm/templates/feed/feed.html | 24 +++++++----------------- bookwyrm/urls.py | 2 +- bookwyrm/views/feed.py | 9 +++++---- 5 files changed, 22 insertions(+), 27 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 4e464b3c..2f155538 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -4,9 +4,9 @@ from django.db.models import signals, Q from bookwyrm import models from bookwyrm.redis_store import RedisStore, r +from bookwyrm.settings import STREAMS from bookwyrm.views.helpers import privacy_filter - class ActivityStream(RedisStore): """a category of activity stream (like home, local, federated)""" @@ -218,13 +218,13 @@ class BooksStream(ActivityStream): ) -streams = { +available_streams = [s["key"] for s in STREAMS] +streams = {k:v for (k, v) in { "home": HomeStream(), "local": LocalStream(), "federated": FederatedStream(), "books": BooksStream(), -} - +}.items() if k in available_streams} @receiver(signals.post_save) # pylint: disable=unused-argument diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index a10f128d..180191d9 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -118,7 +118,11 @@ REDIS_ACTIVITY_PORT = env("REDIS_ACTIVITY_PORT", 6379) REDIS_ACTIVITY_PASSWORD = env("REDIS_ACTIVITY_PASSWORD", None) MAX_STREAM_LENGTH = int(env("MAX_STREAM_LENGTH", 200)) -STREAMS = ["home", "books"] + +STREAMS = [ + {"key": "home", "name": _("Home Timeline"), "shortname": _("Home")}, + {"key": "books", "name": _("Books Timeline"), "shortname": _("Books")}, +] # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases diff --git a/bookwyrm/templates/feed/feed.html b/bookwyrm/templates/feed/feed.html index 65cf97e1..780f1d17 100644 --- a/bookwyrm/templates/feed/feed.html +++ b/bookwyrm/templates/feed/feed.html @@ -4,35 +4,25 @@ {% block panel %}

- {% if tab == 'home' %} - {% trans "Home Timeline" %} - {% elif tab == 'local' %} - {% trans "Local Timeline" %} - {% else %} - {% trans "Federated Timeline" %} - {% endif %} + {{ tab.name }}

{# announcements and system messages #} {% if not activities.number > 1 %} -{% 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 %}
{% include 'snippets/goal_card.html' with year=year %} diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 3d39b9d5..d3e2dad1 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -23,7 +23,7 @@ STATUS_PATH = r"%s/(%s)/(?P\d+)" % (USER_PATH, "|".join(status_types) BOOK_PATH = r"^book/(?P\d+)" -STREAMS = "|".join(settings.STREAMS) +STREAMS = "|".join(s["key"] for s in settings.STREAMS) urlpatterns = [ path("admin/", admin.site.urls), diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py index 3001c86e..d28166a3 100644 --- a/bookwyrm/views/feed.py +++ b/bookwyrm/views/feed.py @@ -23,10 +23,10 @@ class Feed(View): def get(self, request, tab): """user's homepage with activity feed""" - if not tab in STREAMS: - tab = "home" + tab = [s for s in STREAMS if s["key"] == tab] + tab = tab[0] or 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) suggestions = suggested_users.get_suggestions(request.user) @@ -38,8 +38,9 @@ class Feed(View): "activities": paginated.get_page(request.GET.get("page")), "suggested_users": suggestions, "tab": tab, + "streams": STREAMS, "goal_form": forms.GoalForm(), - "path": "/%s" % tab, + "path": "/%s" % tab["key"], }, } return TemplateResponse(request, "feed/feed.html", data) From 9d19092205bb2b0db2e120455e11edb563db9d80 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 4 Aug 2021 18:22:06 -0700 Subject: [PATCH 04/10] Updates tests --- bookwyrm/activitystreams.py | 18 ++++++++++++------ .../tests/management/test_populate_streams.py | 2 +- bookwyrm/tests/views/test_feed.py | 2 +- bookwyrm/views/feed.py | 6 ++++-- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 2f155538..0a966971 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -7,6 +7,7 @@ from bookwyrm.redis_store import RedisStore, r from bookwyrm.settings import STREAMS from bookwyrm.views.helpers import privacy_filter + class ActivityStream(RedisStore): """a category of activity stream (like home, local, federated)""" @@ -219,12 +220,17 @@ class BooksStream(ActivityStream): available_streams = [s["key"] for s in STREAMS] -streams = {k:v for (k, v) in { - "home": HomeStream(), - "local": LocalStream(), - "federated": FederatedStream(), - "books": BooksStream(), -}.items() if k in available_streams} +streams = { + k: v + for (k, v) in { + "home": HomeStream(), + "local": LocalStream(), + "federated": FederatedStream(), + "books": BooksStream(), + }.items() + if k in available_streams +} + @receiver(signals.post_save) # pylint: disable=unused-argument diff --git a/bookwyrm/tests/management/test_populate_streams.py b/bookwyrm/tests/management/test_populate_streams.py index ee7a96d7..c080e3fe 100644 --- a/bookwyrm/tests/management/test_populate_streams.py +++ b/bookwyrm/tests/management/test_populate_streams.py @@ -46,4 +46,4 @@ class Activitystreams(TestCase): "bookwyrm.activitystreams.ActivityStream.populate_store" ) as redis_mock: 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 diff --git a/bookwyrm/tests/views/test_feed.py b/bookwyrm/tests/views/test_feed.py index 8a38b808..666c3e02 100644 --- a/bookwyrm/tests/views/test_feed.py +++ b/bookwyrm/tests/views/test_feed.py @@ -45,7 +45,7 @@ class FeedViews(TestCase): view = views.Feed.as_view() request = self.factory.get("") request.user = self.local_user - result = view(request, "local") + result = view(request, "home") self.assertIsInstance(result, TemplateResponse) result.render() self.assertEqual(result.status_code, 200) diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py index d28166a3..7a46ca57 100644 --- a/bookwyrm/views/feed.py +++ b/bookwyrm/views/feed.py @@ -24,9 +24,11 @@ class Feed(View): def get(self, request, tab): """user's homepage with activity feed""" tab = [s for s in STREAMS if s["key"] == tab] - tab = tab[0] or STREAMS[0] + tab = tab[0] if tab else STREAMS[0] - activities = activitystreams.streams[tab["key"]].get_activity_stream(request.user) + activities = activitystreams.streams[tab["key"]].get_activity_stream( + request.user + ) paginated = Paginator(activities, PAGE_LENGTH) suggestions = suggested_users.get_suggestions(request.user) From 3b46ce85011b049f5ad8117ba98820b6250f5a31 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 4 Aug 2021 18:57:05 -0700 Subject: [PATCH 05/10] Locale updates --- locale/de_DE/LC_MESSAGES/django.mo | Bin 24293 -> 24142 bytes locale/de_DE/LC_MESSAGES/django.po | 103 ++++++++++++++------------- locale/en_US/LC_MESSAGES/django.po | 90 ++++++++++++----------- locale/es/LC_MESSAGES/django.mo | Bin 43107 -> 42719 bytes locale/es/LC_MESSAGES/django.po | 101 ++++++++++++++------------ locale/fr_FR/LC_MESSAGES/django.mo | Bin 45939 -> 45471 bytes locale/fr_FR/LC_MESSAGES/django.po | 101 ++++++++++++++------------ locale/zh_Hans/LC_MESSAGES/django.mo | Bin 42356 -> 41974 bytes locale/zh_Hans/LC_MESSAGES/django.po | 100 ++++++++++++++------------ locale/zh_Hant/LC_MESSAGES/django.mo | Bin 41166 -> 40752 bytes locale/zh_Hant/LC_MESSAGES/django.po | 100 ++++++++++++++------------ 11 files changed, 321 insertions(+), 274 deletions(-) diff --git a/locale/de_DE/LC_MESSAGES/django.mo b/locale/de_DE/LC_MESSAGES/django.mo index fb15184108c67c333088d8b27062a76939709a84..543d5355901e12d226dbe40f6d72ce8e7cf616f3 100644 GIT binary patch delta 7260 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 delta 7413 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 diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po index 5edf43d6..b047f031 100644 --- a/locale/de_DE/LC_MESSAGES/django.po +++ b/locale/de_DE/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.1\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" "Last-Translator: Mouse Reeve \n" "Language-Team: English \n" @@ -101,27 +101,49 @@ msgstr "Username" msgid "A user with that username already exists." 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" msgstr "Englisch" -#: bookwyrm/settings.py:167 +#: bookwyrm/settings.py:171 msgid "German" msgstr "Deutsch" -#: bookwyrm/settings.py:168 +#: bookwyrm/settings.py:172 msgid "Spanish" msgstr "Spanisch" -#: bookwyrm/settings.py:169 +#: bookwyrm/settings.py:173 msgid "French" msgstr "Französisch" -#: bookwyrm/settings.py:170 +#: bookwyrm/settings.py:174 msgid "Simplified Chinese" msgstr "Vereinfachtes Chinesisch" -#: bookwyrm/settings.py:171 +#: bookwyrm/settings.py:175 msgid "Traditional Chinese" msgstr "" @@ -972,39 +994,12 @@ msgstr "Alle Nachrichten" msgid "You have no messages right now." msgstr "Du hast momentan keine Nachrichten." -#: bookwyrm/templates/feed/feed.html:8 -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 +#: bookwyrm/templates/feed/feed.html:22 #, python-format -msgid "load 0 unread status(es)" +msgid "load 0 unread status(es)" 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" 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" 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:46 #: bookwyrm/templates/settings/admin_layout.html:26 @@ -2242,6 +2229,10 @@ msgstr "Instanzname" msgid "Status:" msgstr "Importstatus" +#: bookwyrm/templates/settings/edit_server.html:40 +msgid "Federated" +msgstr "Föderiert" + #: bookwyrm/templates/settings/edit_server.html:41 #: bookwyrm/templates/settings/federated_server.html:10 #, fuzzy @@ -2573,15 +2564,23 @@ msgstr "Registrierungen geschlossen text" msgid "Posted by %(username)s" msgstr "Direktnachrichten mit %(username)s" +#: 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 #, fuzzy #| msgid "Add cover" msgid "No cover" msgstr "Cover hinzufügen" -#: bookwyrm/templates/snippets/book_titleby.html:4 -#, python-format -msgid "%(title)s by " +#: bookwyrm/templates/snippets/book_titleby.html:6 +#, fuzzy, python-format +#| msgid "%(title)s by " +msgid "%(title)s by" msgstr "%(title)s von " #: 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" msgstr "" +#, fuzzy +#~| msgid "Federated Servers" +#~ msgid "Federated Timeline" +#~ msgstr "Föderierende Server" + +#~ msgid "Local" +#~ msgstr "Lokal" + #, fuzzy #~| msgid "Direct Messages with %(username)s" #~ msgid "Remove %(name)s" diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po index ce06013f..153d8b9a 100644 --- a/locale/en_US/LC_MESSAGES/django.po +++ b/locale/en_US/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.1\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" "Last-Translator: Mouse Reeve \n" "Language-Team: English \n" @@ -91,27 +91,45 @@ msgstr "" msgid "A user with that username already exists." msgstr "" -#: bookwyrm/settings.py:166 -msgid "English" +#: bookwyrm/settings.py:123 +msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:167 -msgid "German" +#: bookwyrm/settings.py:123 +msgid "Home" msgstr "" -#: bookwyrm/settings.py:168 -msgid "Spanish" +#: bookwyrm/settings.py:124 +msgid "Books Timeline" msgstr "" -#: bookwyrm/settings.py:169 -msgid "French" +#: 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 "Simplified Chinese" +msgid "English" msgstr "" #: 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" msgstr "" @@ -896,37 +914,12 @@ msgstr "" msgid "You have no messages right now." msgstr "" -#: bookwyrm/templates/feed/feed.html:8 -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 +#: bookwyrm/templates/feed/feed.html:22 #, python-format -msgid "load 0 unread status(es)" +msgid "load 0 unread status(es)" 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" msgstr "" @@ -1864,12 +1857,6 @@ msgstr "" msgid "Search type" 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:46 #: bookwyrm/templates/settings/admin_layout.html:26 @@ -2045,6 +2032,10 @@ msgstr "" msgid "Status:" msgstr "" +#: bookwyrm/templates/settings/edit_server.html:40 +msgid "Federated" +msgstr "" + #: bookwyrm/templates/settings/edit_server.html:41 #: bookwyrm/templates/settings/federated_server.html:10 msgid "Blocked" @@ -2333,13 +2324,20 @@ msgstr "" msgid "Posted by %(username)s" 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 msgid "No cover" msgstr "" -#: bookwyrm/templates/snippets/book_titleby.html:4 +#: bookwyrm/templates/snippets/book_titleby.html:6 #, python-format -msgid "%(title)s by " +msgid "%(title)s by" msgstr "" #: bookwyrm/templates/snippets/boost_button.html:20 diff --git a/locale/es/LC_MESSAGES/django.mo b/locale/es/LC_MESSAGES/django.mo index 69c734d46688d85bc60fa4b8f060ab0c9fbd8109..23869cf45428ccb9c4d7e0d8a06dc96b209e7775 100644 GIT binary patch delta 13188 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 delta 13514 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 j>HT+Jp5Y@rsVT>HB##)K>9;W|bJzNOdm3+8lk\n" "Language-Team: LANGUAGE \n" @@ -91,27 +91,47 @@ msgstr "nombre de usuario" msgid "A user with that username already exists." 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" msgstr "Inglés" -#: bookwyrm/settings.py:167 +#: bookwyrm/settings.py:171 msgid "German" msgstr "Aléman" -#: bookwyrm/settings.py:168 +#: bookwyrm/settings.py:172 msgid "Spanish" msgstr "Español" -#: bookwyrm/settings.py:169 +#: bookwyrm/settings.py:173 msgid "French" msgstr "Francés" -#: bookwyrm/settings.py:170 +#: bookwyrm/settings.py:174 msgid "Simplified Chinese" msgstr "Chino simplificado" -#: bookwyrm/settings.py:171 +#: bookwyrm/settings.py:175 #, fuzzy #| msgid "Additional info:" msgid "Traditional Chinese" @@ -904,37 +924,13 @@ msgstr "Todos los mensajes" msgid "You have no messages right now." msgstr "No tienes ningún mensaje en este momento." -#: bookwyrm/templates/feed/feed.html:8 -msgid "Home Timeline" -msgstr "Línea temporal de hogar" - -#: 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 0 unread status(es)" +#: bookwyrm/templates/feed/feed.html:22 +#, fuzzy, python-format +#| msgid "load 0 unread status(es)" +msgid "load 0 unread status(es)" msgstr "cargar 0 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" msgstr "¡No hay actividad ahora mismo! Sigue a otro usuario para empezar" @@ -1885,12 +1881,6 @@ msgstr "Búsqueda" msgid "Search type" 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:46 #: bookwyrm/templates/settings/admin_layout.html:26 @@ -2072,6 +2062,10 @@ msgstr "Instancia:" msgid "Status:" msgstr "Status:" +#: bookwyrm/templates/settings/edit_server.html:40 +msgid "Federated" +msgstr "Federalizado" + #: bookwyrm/templates/settings/edit_server.html:41 #: bookwyrm/templates/settings/federated_server.html:10 msgid "Blocked" @@ -2366,13 +2360,21 @@ msgstr "Texto de registración cerrada:" msgid "Posted by %(username)s" msgstr "Publicado por %(username)s" +#: 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 msgid "No cover" msgstr "Sin portada" -#: bookwyrm/templates/snippets/book_titleby.html:4 -#, python-format -msgid "%(title)s by " +#: bookwyrm/templates/snippets/book_titleby.html:6 +#, fuzzy, python-format +#| msgid "%(title)s by " +msgid "%(title)s by" msgstr "%(title)s por " #: 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" 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 %(name)s" #~ msgstr "Eliminar %(name)s" diff --git a/locale/fr_FR/LC_MESSAGES/django.mo b/locale/fr_FR/LC_MESSAGES/django.mo index 3d622ac662185de82e67b3026ad6d339fb8dab0a..f8ade2a391ba574da54afa6f45e1bf1ad55f9372 100644 GIT binary patch delta 13530 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 DvSMj) delta 13937 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\n" "Language-Team: Mouse Reeve \n" @@ -91,27 +91,47 @@ msgstr "nom du compte :" msgid "A user with that username already exists." msgstr "Ce nom est déjà associé à un compte." -#: bookwyrm/settings.py:166 +#: bookwyrm/settings.py:123 +msgid "Home Timeline" +msgstr "Mon fil d’actualité" + +#: 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" msgstr "English" -#: bookwyrm/settings.py:167 +#: bookwyrm/settings.py:171 msgid "German" msgstr "Deutsch" -#: bookwyrm/settings.py:168 +#: bookwyrm/settings.py:172 msgid "Spanish" msgstr "Español" -#: bookwyrm/settings.py:169 +#: bookwyrm/settings.py:173 msgid "French" msgstr "Français" -#: bookwyrm/settings.py:170 +#: bookwyrm/settings.py:174 msgid "Simplified Chinese" msgstr "简化字" -#: bookwyrm/settings.py:171 +#: bookwyrm/settings.py:175 #, fuzzy #| msgid "Additional info:" msgid "Traditional Chinese" @@ -900,37 +920,13 @@ msgstr "Tous les messages" msgid "You have no messages right now." msgstr "Vous n’avez aucun message pour l’instant." -#: bookwyrm/templates/feed/feed.html:8 -msgid "Home Timeline" -msgstr "Mon fil d’actualité" - -#: bookwyrm/templates/feed/feed.html:10 -msgid "Local Timeline" -msgstr "Fil d’actualité local" - -#: bookwyrm/templates/feed/feed.html:12 -msgid "Federated Timeline" -msgstr "Fil d’actualité 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 0 unread status(es)" +#: bookwyrm/templates/feed/feed.html:22 +#, fuzzy, python-format +#| msgid "load 0 unread status(es)" +msgid "load 0 unread status(es)" msgstr "charger le(s) 0 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" msgstr "Aucune activité pour l’instant ! Abonnez‑vous à quelqu’un pour commencer" @@ -1879,12 +1875,6 @@ msgstr "Requête" msgid "Search type" 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:46 #: bookwyrm/templates/settings/admin_layout.html:26 @@ -2060,6 +2050,10 @@ msgstr "Instance :" msgid "Status:" 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/federated_server.html:10 msgid "Blocked" @@ -2348,13 +2342,21 @@ msgstr "Texte affiché lorsque les inscriptions sont closes :" msgid "Posted by %(username)s" msgstr "Publiée par %(username)s" +#: 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 msgid "No cover" msgstr "Pas de couverture" -#: bookwyrm/templates/snippets/book_titleby.html:4 -#, python-format -msgid "%(title)s by " +#: bookwyrm/templates/snippets/book_titleby.html:6 +#, fuzzy, python-format +#| msgid "%(title)s by " +msgid "%(title)s by" msgstr "%(title)s par " #: bookwyrm/templates/snippets/boost_button.html:20 @@ -3026,6 +3028,15 @@ msgstr "Aucun compte avec cette adresse email n’a été trouvé." msgid "A password reset link sent to %s" msgstr "Un lien de réinitialisation a été envoyé à %s." +#~ msgid "Local Timeline" +#~ msgstr "Fil d’actualité local" + +#~ msgid "Federated Timeline" +#~ msgstr "Fil d’actualité des instances fédérées" + +#~ msgid "Local" +#~ msgstr "Local" + #, fuzzy #~| msgid "BookWyrm users" #~ msgid "BookWyrm\\" diff --git a/locale/zh_Hans/LC_MESSAGES/django.mo b/locale/zh_Hans/LC_MESSAGES/django.mo index 3450c353ac4b48e9636805a6a77931a74b68dd92..6645033399a2ca839b8ebe71c829b209d23bfd31 100644 GIT binary patch delta 13776 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

u}4WqQBtflA*pe)b9{Hy2?$PJD0E=j&CoD}Mz zIE8YClABVQqEA3I`u>;pnyBj{^#gcBfn8BJpZr2f7A5;COFbX=b+dc_%)$O^lKg-k zld^kZJvyXP>Qm22S^BR*@=&iqZZxGf_2bx>(u(>KN?99R|1nUOd?RwYzHxCnS?mpU z{$1!ein51>Zz)OC-?UDbY41(lkHQZ^r#Z#n+KONlr7it8lh^eU^{?>(B?tBF>kgGq zD90#?+|!D-Q1rx-c$X4RP?=;VenIl*H|4-zD7UyF-UeuDo+Mv}a+Y{CUZ=dwJv)gDP+wsEem56kEcp`j zS&95b{?phH@Be`)=t-(6WfIMsu>z$q`5}}-GH8 zm8^eX@}H6$MfriEt3A2J*aBblW_Sl5azit3z*mIb+=mXuDF2X;u-r83bCx)qw(M&H zm4?JcDY>mLKj0l-;w{93us@|YWei2Xf@EJW>oZV_@(mrsEIW-(OQ{dR>}xXho|Mic zZqfG@tV%qcx~@7d&V4*#xym?<5@T^UeAVjeo}2qUUz6xcWdvo`zZzd5E@W{>I+r5O zzIIWWOQ}M6gFd$@jjg>8_4g@XP_nQ0s7G0QMUq>s;WvE-Mq0;Hmi!P$P?EXfyyd3R zXA||(xCMRj6T44co>T8dnN4|%GLd_yP=27U>pb3}{6xJY`AgLQp@jHw{!^%AU++?X zPH+ed(^1zP>gBCZUgBu-EwLhQwfu*es?J;u$mb*e)(xGp)NfL@QF76ifx4zr_kIT^ zV^K@)rQT8vTw_hu=h6NZC4su1cHiR zNM8F+Z0{%U7Q>E7dJhol&8;l)HU42>5GpkBgl8KTrB;@QSWAP3bC%!c5gjg zNZikdzrn1r7kz`+_ zUYxoXDR~0jmdJozb5m%$W zQLpoADq$oik$j)JuAit^q_m@6pEg|sT%0e-cP6)rcq(NcWgj_R-A&c6SiLp=VfB}B z0HwLb-q)!royX`7E*~1gtTBN}+EH@a0@PlPQjPYvtf!D2=!wKjnbN(AU{WN*fYgNL;6`YXlxw=luI1(jw+Kn2Jm>luH$w?h5gf~eZl{he>LCWaFkr4wEQxl^{k4jE% zSUM$jY*ONg*m6;+iTx|2lx|d|L9DtoiWoPNhJg_&sfnrMQlgSlDx|L+7MotPUSxXv zVKM2W2S;YMA2!@Sdnx`AS*teQp0zc7U){*evtwdH0<)IwxwGuUTl)`ZKJ;|<3%#{% zxs#Q#{bt6l|7&RWx^H;nIcskpJox`uSJtX^Ss7bz?>um8&YrAkY3Uu;N2KRnQ!>5y M+MvvN>xTOL571!SLjV8( diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po index f74dfd4a..d9921655 100644 --- a/locale/zh_Hans/LC_MESSAGES/django.po +++ b/locale/zh_Hans/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1.1\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" "Last-Translator: Kana \n" "Language-Team: Mouse Reeve \n" @@ -91,27 +91,47 @@ msgstr "用户名" msgid "A user with that username already exists." 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" msgstr "English(英语)" -#: bookwyrm/settings.py:167 +#: bookwyrm/settings.py:171 msgid "German" msgstr "Deutsch(德语)" -#: bookwyrm/settings.py:168 +#: bookwyrm/settings.py:172 msgid "Spanish" msgstr "Español(西班牙语)" -#: bookwyrm/settings.py:169 +#: bookwyrm/settings.py:173 msgid "French" msgstr "Français(法语)" -#: bookwyrm/settings.py:170 +#: bookwyrm/settings.py:174 msgid "Simplified Chinese" msgstr "简体中文" -#: bookwyrm/settings.py:171 +#: bookwyrm/settings.py:175 msgid "Traditional Chinese" msgstr "繁體中文(繁体中文)" @@ -895,37 +915,13 @@ msgstr "所有消息" msgid "You have no messages right now." msgstr "你现在没有消息。" -#: bookwyrm/templates/feed/feed.html:8 -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 -msgid "load 0 unread status(es)" +#: bookwyrm/templates/feed/feed.html:22 +#, fuzzy, python-format +#| msgid "load 0 unread status(es)" +msgid "load 0 unread status(es)" msgstr "加载 0 条未读状态" -#: 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" msgstr "现在还没有任何活动!尝试从关注一个用户开始吧" @@ -1865,12 +1861,6 @@ msgstr "搜索请求" msgid "Search type" 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:46 #: bookwyrm/templates/settings/admin_layout.html:26 @@ -2046,6 +2036,10 @@ msgstr "实例:" msgid "Status:" msgstr "状态:" +#: bookwyrm/templates/settings/edit_server.html:40 +msgid "Federated" +msgstr "跨站" + #: bookwyrm/templates/settings/edit_server.html:41 #: bookwyrm/templates/settings/federated_server.html:10 msgid "Blocked" @@ -2334,13 +2328,20 @@ msgstr "注册关闭文字:" msgid "Posted by %(username)s" msgstr "由 %(username)s 发布" +#: 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 msgid "No cover" msgstr "没有封面" -#: bookwyrm/templates/snippets/book_titleby.html:4 -#, python-format -msgid "%(title)s by " +#: bookwyrm/templates/snippets/book_titleby.html:6 +#, fuzzy, python-format +#| msgid "%(title)s by " +msgid "%(title)s by" msgstr "%(title)s 来自" #: bookwyrm/templates/snippets/boost_button.html:20 @@ -3003,3 +3004,12 @@ msgstr "没有找到使用该邮箱的用户。" #, python-format msgid "A password reset link sent to %s" msgstr "密码重置连接已发送给 %s" + +#~ msgid "Local Timeline" +#~ msgstr "本地时间线" + +#~ msgid "Federated Timeline" +#~ msgstr "跨站时间线" + +#~ msgid "Local" +#~ msgstr "本站" diff --git a/locale/zh_Hant/LC_MESSAGES/django.mo b/locale/zh_Hant/LC_MESSAGES/django.mo index 8c8b5af887a30a2430d7a568e4e987d971a822fb..552fea2a6ea9d89a28105fe6338f09b8053c81ce 100644 GIT binary patch delta 13344 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 diff --git a/locale/zh_Hant/LC_MESSAGES/django.po b/locale/zh_Hant/LC_MESSAGES/django.po index b7736822..5ce42251 100644 --- a/locale/zh_Hant/LC_MESSAGES/django.po +++ b/locale/zh_Hant/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.1\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" "Last-Translator: Grace Cheng \n" "Language-Team: LANGUAGE \n" @@ -91,27 +91,47 @@ msgstr "使用者名稱" msgid "A user with that username already exists." 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" msgstr "English(英語)" -#: bookwyrm/settings.py:167 +#: bookwyrm/settings.py:171 msgid "German" msgstr "Deutsch(德語)" -#: bookwyrm/settings.py:168 +#: bookwyrm/settings.py:172 msgid "Spanish" msgstr "Español(西班牙語)" -#: bookwyrm/settings.py:169 +#: bookwyrm/settings.py:173 msgid "French" msgstr "Français(法語)" -#: bookwyrm/settings.py:170 +#: bookwyrm/settings.py:174 msgid "Simplified Chinese" msgstr "簡體中文" -#: bookwyrm/settings.py:171 +#: bookwyrm/settings.py:175 #, fuzzy #| msgid "Tranditional Chinese" msgid "Traditional Chinese" @@ -901,37 +921,13 @@ msgstr "所有訊息" msgid "You have no messages right now." msgstr "你現在沒有訊息。" -#: bookwyrm/templates/feed/feed.html:8 -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 -msgid "load 0 unread status(es)" +#: bookwyrm/templates/feed/feed.html:22 +#, fuzzy, python-format +#| msgid "load 0 unread status(es)" +msgid "load 0 unread status(es)" msgstr "載入 0 條未讀狀態" -#: 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" msgstr "現在還沒有任何活動!嘗試著從關注一個使用者開始吧" @@ -1880,12 +1876,6 @@ msgstr "搜尋請求" msgid "Search type" 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:46 #: bookwyrm/templates/settings/admin_layout.html:26 @@ -2061,6 +2051,10 @@ msgstr "實例:" msgid "Status:" msgstr "狀態:" +#: bookwyrm/templates/settings/edit_server.html:40 +msgid "Federated" +msgstr "跨站" + #: bookwyrm/templates/settings/edit_server.html:41 #: bookwyrm/templates/settings/federated_server.html:10 msgid "Blocked" @@ -2353,13 +2347,20 @@ msgstr "註冊關閉文字:" msgid "Posted by %(username)s" msgstr "由 %(username)s 釋出" +#: 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 msgid "No cover" msgstr "沒有封面" -#: bookwyrm/templates/snippets/book_titleby.html:4 -#, python-format -msgid "%(title)s by " +#: bookwyrm/templates/snippets/book_titleby.html:6 +#, fuzzy, python-format +#| msgid "%(title)s by " +msgid "%(title)s by" msgstr "%(title)s 來自" #: bookwyrm/templates/snippets/boost_button.html:20 @@ -3023,5 +3024,14 @@ msgstr "沒有找到使用該郵箱的使用者。" msgid "A password reset link sent to %s" msgstr "密碼重置連結已傳送給 %s" +#~ msgid "Local Timeline" +#~ msgstr "本地時間線" + +#~ msgid "Federated Timeline" +#~ msgstr "跨站時間線" + +#~ msgid "Local" +#~ msgstr "本站" + #~ msgid "Remove %(name)s" #~ msgstr "移除 %(name)s" From 75f586c10983e70169df495b835d4ffa58757454 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 4 Aug 2021 19:09:00 -0700 Subject: [PATCH 06/10] Removes unused stream code --- bookwyrm/activitystreams.py | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 0a966971..b4926285 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -156,25 +156,6 @@ class LocalStream(ActivityStream): ) -class FederatedStream(ActivityStream): - """users you follow""" - - key = "federated" - - def get_audience(self, status): - # this stream wants no part in non-public statuses - if status.privacy != "public": - return [] - return super().get_audience(status) - - def get_statuses_for_user(self, user): - return privacy_filter( - user, - models.Status.objects.select_subclasses(), - privacy_levels=["public"], - ) - - class BooksStream(ActivityStream): """books on your shelves""" @@ -201,7 +182,7 @@ class BooksStream(ActivityStream): return audience.filter(shelfbook__book__parent_work=work).distinct() def get_statuses_for_user(self, user): - """any public status that mentions their books""" + """any public status that mentions the user's books""" books = user.shelfbook_set.values_list( "book__parent_work__id", flat=True ).distinct() @@ -219,13 +200,13 @@ class BooksStream(ActivityStream): ) +# determine which streams are enabled in settings.py available_streams = [s["key"] for s in STREAMS] streams = { k: v for (k, v) in { "home": HomeStream(), "local": LocalStream(), - "federated": FederatedStream(), "books": BooksStream(), }.items() if k in available_streams From 1c0472efc2835d15072d5346df1e39dda555846a Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 4 Aug 2021 19:19:24 -0700 Subject: [PATCH 07/10] Fixes references to public streams --- bookwyrm/activitystreams.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index b4926285..7c15fd90 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -9,7 +9,7 @@ from bookwyrm.views.helpers import privacy_filter 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): """the redis key for this user's instance of this stream""" @@ -229,7 +229,6 @@ def add_status_on_create(sender, instance, created, *args, **kwargs): if not created: return - # iterates through Home, Local, Federated for stream in streams.values(): stream.add_status(instance) @@ -296,7 +295,7 @@ def remove_statuses_on_block(sender, instance, *args, **kwargs): # pylint: disable=unused-argument def add_statuses_on_unblock(sender, instance, *args, **kwargs): """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 if instance.user_subject.local: for stream in public_streams: From c8250ac94cf342567207b473eb06cb56426b9c59 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 4 Aug 2021 19:25:44 -0700 Subject: [PATCH 08/10] Python formatting --- bookwyrm/activitystreams.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 7c15fd90..01ca3f77 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -295,7 +295,7 @@ def remove_statuses_on_block(sender, instance, *args, **kwargs): # pylint: disable=unused-argument def add_statuses_on_unblock(sender, instance, *args, **kwargs): """remove statuses from all feeds on block""" - public_streams = [v for (k, v) in streams.items() if k != 'home'] + public_streams = [v for (k, v) in streams.items() if k != "home"] # add statuses back to streams with statuses from anyone if instance.user_subject.local: for stream in public_streams: From 142d0da3b73a5a5f679c187771c58392b0169ce1 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 4 Aug 2021 20:01:44 -0700 Subject: [PATCH 09/10] Removes outdated tests --- bookwyrm/tests/test_activitystreams.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/bookwyrm/tests/test_activitystreams.py b/bookwyrm/tests/test_activitystreams.py index f4747971..22445892 100644 --- a/bookwyrm/tests/test_activitystreams.py +++ b/bookwyrm/tests/test_activitystreams.py @@ -190,20 +190,3 @@ class Activitystreams(TestCase): ) users = activitystreams.LocalStream().get_audience(status) self.assertEqual(users, []) - - def test_federatedstream_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.FederatedStream().get_audience(status) - self.assertTrue(self.local_user in users) - self.assertTrue(self.another_user in users) - - def test_federatedstream_get_audience_unlisted(self, *_): - """get a list of users that should see a status""" - status = models.Status.objects.create( - user=self.remote_user, content="hi", privacy="unlisted" - ) - users = activitystreams.FederatedStream().get_audience(status) - self.assertEqual(users, []) From f3a757951cdb40364546b843577c29ca5a3c0b3a Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Thu, 5 Aug 2021 14:22:54 -0700 Subject: [PATCH 10/10] Tests for books stream --- bookwyrm/tests/test_activitystreams.py | 97 +++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) diff --git a/bookwyrm/tests/test_activitystreams.py b/bookwyrm/tests/test_activitystreams.py index 22445892..ba495089 100644 --- a/bookwyrm/tests/test_activitystreams.py +++ b/bookwyrm/tests/test_activitystreams.py @@ -6,6 +6,7 @@ from bookwyrm import activitystreams, models @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") @patch("bookwyrm.activitystreams.ActivityStream.add_status") +@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") class Activitystreams(TestCase): """using redis to build activity streams""" @@ -32,7 +33,8 @@ class Activitystreams(TestCase): inbox="https://example.com/users/rat/inbox", 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): """test stream, don't have to do anything here""" @@ -190,3 +192,96 @@ class Activitystreams(TestCase): ) 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])