From 290192204e61ba0b2ffd75759e719928558e4c6f Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 27 Jun 2021 11:47:49 -0700 Subject: [PATCH 01/14] Fixes user json views Fixes #1198 --- bookwyrm/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 35540358..ea73f038 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -192,8 +192,8 @@ urlpatterns = [ re_path(r"^import/?$", views.Import.as_view(), name="import"), re_path(r"^import/(\d+)/?$", views.ImportStatus.as_view(), name="import-status"), # users - re_path(r"%s/?$" % USER_PATH, views.User.as_view(), name="user-feed"), re_path(r"%s\.json$" % USER_PATH, views.User.as_view()), + re_path(r"%s/?$" % USER_PATH, views.User.as_view(), name="user-feed"), re_path(r"%s/rss" % USER_PATH, views.rss_feed.RssFeed(), name="user-rss"), re_path( r"%s/followers(.json)?/?$" % USER_PATH, From a27adf596b488e37fd211b54df7a966871ac485b Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 27 Jun 2021 12:14:55 -0700 Subject: [PATCH 02/14] Adds prompt to include instance in bug reports --- .github/ISSUE_TEMPLATE/bug_report.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 56af524e..0f663aa3 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Bug report about: Create a report to help us improve title: '' -labels: '' +labels: 'bug' assignees: '' --- @@ -23,6 +23,14 @@ A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. +**Instance** +On which BookWyrm instance did you encounter this problem. + +**Additional context** +Add any other context about the problem here. + +--- + **Desktop (please complete the following information):** - OS: [e.g. iOS] - Browser [e.g. chrome, safari] @@ -33,6 +41,3 @@ If applicable, add screenshots to help explain your problem. - OS: [e.g. iOS8.1] - Browser [e.g. stock browser, safari] - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. From e13ddb10d0f94b105f5ef8eefb10b8912a4836cf Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 28 Jun 2021 13:50:04 -0700 Subject: [PATCH 03/14] Avoids template errors in dev when imports can't connect to redis --- bookwyrm/views/import_data.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bookwyrm/views/import_data.py b/bookwyrm/views/import_data.py index b2b88a2e..70b9f89d 100644 --- a/bookwyrm/views/import_data.py +++ b/bookwyrm/views/import_data.py @@ -84,7 +84,9 @@ class ImportStatus(View): try: task = app.AsyncResult(job.task_id) - except ValueError: + # triggers attribute error if the task won't load + task.status # pylint: disable=pointless-statement + except (ValueError, AttributeError): task = None items = job.items.order_by("index").all() From 9461784a18bf18a0aafb4314addaf0d923c7c16c Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 28 Jun 2021 13:54:38 -0700 Subject: [PATCH 04/14] Python formtting --- bookwyrm/views/import_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/import_data.py b/bookwyrm/views/import_data.py index 70b9f89d..9e2e817d 100644 --- a/bookwyrm/views/import_data.py +++ b/bookwyrm/views/import_data.py @@ -85,7 +85,7 @@ class ImportStatus(View): try: task = app.AsyncResult(job.task_id) # triggers attribute error if the task won't load - task.status # pylint: disable=pointless-statement + task.status # pylint: disable=pointless-statement except (ValueError, AttributeError): task = None From b720740762f277201a5a25e1579e54f601549ffc Mon Sep 17 00:00:00 2001 From: gra-ch Date: Wed, 30 Jun 2021 13:54:56 +0800 Subject: [PATCH 05/14] Add Tranditional Chinese translation --- bookwyrm/settings.py | 1 + locale/zh_Hant/LC_MESSAGES/django.po | 2911 ++++++++++++++++++++++++++ 2 files changed, 2912 insertions(+) create mode 100644 locale/zh_Hant/LC_MESSAGES/django.po diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index b928f97e..50b526bd 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -166,6 +166,7 @@ LANGUAGES = [ ("es", _("Spanish")), ("fr-fr", _("French")), ("zh-hans", _("Simplified Chinese")), + ("zh-hant", _("Traditional Chinese")), ] diff --git a/locale/zh_Hant/LC_MESSAGES/django.po b/locale/zh_Hant/LC_MESSAGES/django.po new file mode 100644 index 00000000..e11f024b --- /dev/null +++ b/locale/zh_Hant/LC_MESSAGES/django.po @@ -0,0 +1,2911 @@ +# Traditional Chinese language text for the bookwyrm UI +# Copyright (C) 2021 Grace Cheng +# This file is distributed under the same license as the bookwyrm package. +# Grace Cheng , 2021. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 0.0.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-06-30 10:36+0000\n" +"PO-Revision-Date: 2021-06-30 10:36+0000\n" +"Last-Translator: Grace Cheng \n" +"Language-Team: LANGUAGE \n" +"Language: zh_Hant\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: bookwyrm/forms.py:224 +msgid "A user with this email already exists." +msgstr "已經存在使用該郵箱的使用者。" + +#: bookwyrm/forms.py:238 +msgid "One Day" +msgstr "一天" + +#: bookwyrm/forms.py:239 +msgid "One Week" +msgstr "一週" + +#: bookwyrm/forms.py:240 +msgid "One Month" +msgstr "一個月" + +#: bookwyrm/forms.py:241 +msgid "Does Not Expire" +msgstr "永不失效" + +#: bookwyrm/forms.py:246 +#, python-format +msgid "%(count)d uses" +msgstr "%(count)d 次使用" + +#: bookwyrm/forms.py:249 +msgid "Unlimited" +msgstr "不受限" + +#: bookwyrm/forms.py:299 +msgid "List Order" +msgstr "列表順序" + +#: bookwyrm/forms.py:300 +msgid "Book Title" +msgstr "書名" + +#: bookwyrm/forms.py:301 bookwyrm/templates/snippets/create_status_form.html:34 +#: bookwyrm/templates/user/shelf/shelf.html:85 +#: bookwyrm/templates/user/shelf/shelf.html:116 +msgid "Rating" +msgstr "評價" + +#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:107 +msgid "Sort By" +msgstr "排序方式" + +#: bookwyrm/forms.py:307 +msgid "Ascending" +msgstr "升序" + +#: bookwyrm/forms.py:308 +msgid "Descending" +msgstr "降序" + +#: bookwyrm/models/fields.py:25 +#, python-format +msgid "%(value)s is not a valid remote_id" +msgstr "%(value)s 不是有效的 remote_id" + +#: bookwyrm/models/fields.py:34 bookwyrm/models/fields.py:43 +#, python-format +msgid "%(value)s is not a valid username" +msgstr "%(value)s 不是有效的使用者名稱" + +#: bookwyrm/models/fields.py:166 bookwyrm/templates/layout.html:152 +msgid "username" +msgstr "使用者名稱" + +#: bookwyrm/models/fields.py:171 +msgid "A user with that username already exists." +msgstr "已經存在使用該名稱的使用者。" + +#: bookwyrm/settings.py:156 +msgid "English" +msgstr "English(英語)" + +#: bookwyrm/settings.py:157 +msgid "German" +msgstr "Deutsch(德語)" + +#: bookwyrm/settings.py:158 +msgid "Spanish" +msgstr "Español(西班牙語)" + +#: bookwyrm/settings.py:159 +msgid "French" +msgstr "Français(法語)" + +#: bookwyrm/settings.py:160 +msgid "Simplified Chinese" +msgstr "簡體中文" + +#: bookwyrm/settings.py:161 +msgid "Tranditional Chinese" +msgstr "繁體中文" + +#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8 +msgid "Not Found" +msgstr "未找到" + +#: bookwyrm/templates/404.html:9 +msgid "The page you requested doesn't seem to exist!" +msgstr "你請求的頁面似乎並不存在!" + +#: bookwyrm/templates/500.html:4 +msgid "Oops!" +msgstr "哎呀!" + +#: bookwyrm/templates/500.html:8 +msgid "Server Error" +msgstr "伺服器錯誤" + +#: bookwyrm/templates/500.html:9 +msgid "Something went wrong! Sorry about that." +msgstr "某些東西出錯了!抱歉。" + +#: bookwyrm/templates/author/author.html:17 +#: bookwyrm/templates/author/author.html:18 +msgid "Edit Author" +msgstr "編輯作者" + +#: bookwyrm/templates/author/author.html:32 +#: bookwyrm/templates/author/edit_author.html:38 +msgid "Aliases:" +msgstr "別名:" + +#: bookwyrm/templates/author/author.html:38 +msgid "Born:" +msgstr "出生:" + +#: bookwyrm/templates/author/author.html:44 +msgid "Died:" +msgstr "逝世:" + +#: bookwyrm/templates/author/author.html:51 +msgid "Wikipedia" +msgstr "維基百科" + +#: bookwyrm/templates/author/author.html:55 +#: bookwyrm/templates/book/book.html:78 +msgid "View on OpenLibrary" +msgstr "在 OpenLibrary 檢視" + +#: bookwyrm/templates/author/author.html:60 +#: bookwyrm/templates/book/book.html:81 +msgid "View on Inventaire" +msgstr "在 Inventaire 檢視" + +#: bookwyrm/templates/author/author.html:74 +#, python-format +msgid "Books by %(name)s" +msgstr "%(name)s 所著的書" + +#: bookwyrm/templates/author/edit_author.html:5 +msgid "Edit Author:" +msgstr "編輯作者:" + +#: bookwyrm/templates/author/edit_author.html:13 +#: bookwyrm/templates/book/edit_book.html:18 +msgid "Added:" +msgstr "新增了:" + +#: bookwyrm/templates/author/edit_author.html:14 +#: bookwyrm/templates/book/edit_book.html:19 +msgid "Updated:" +msgstr "更新了:" + +#: bookwyrm/templates/author/edit_author.html:15 +#: bookwyrm/templates/book/edit_book.html:20 +msgid "Last edited by:" +msgstr "最後編輯者:" + +#: bookwyrm/templates/author/edit_author.html:31 +#: bookwyrm/templates/book/edit_book.html:90 +msgid "Metadata" +msgstr "元資料" + +#: bookwyrm/templates/author/edit_author.html:32 +#: bookwyrm/templates/lists/form.html:8 +#: bookwyrm/templates/user/shelf/create_shelf_form.html:13 +#: bookwyrm/templates/user/shelf/edit_shelf_form.html:14 +msgid "Name:" +msgstr "名稱:" + +#: bookwyrm/templates/author/edit_author.html:40 +#: bookwyrm/templates/book/edit_book.html:132 +#: bookwyrm/templates/book/edit_book.html:141 +#: bookwyrm/templates/book/edit_book.html:178 +msgid "Separate multiple values with commas." +msgstr "請用逗號(,)分隔多個值。" + +#: bookwyrm/templates/author/edit_author.html:46 +msgid "Bio:" +msgstr "簡介:" + +#: bookwyrm/templates/author/edit_author.html:51 +msgid "Wikipedia link:" +msgstr "維基百科連結:" + +#: bookwyrm/templates/author/edit_author.html:57 +msgid "Birth date:" +msgstr "出生日期:" + +#: bookwyrm/templates/author/edit_author.html:65 +msgid "Death date:" +msgstr "死亡日期:" + +#: bookwyrm/templates/author/edit_author.html:73 +msgid "Author Identifiers" +msgstr "作者標識號:" + +#: bookwyrm/templates/author/edit_author.html:74 +msgid "Openlibrary key:" +msgstr "Openlibrary key:" + +#: bookwyrm/templates/author/edit_author.html:79 +#: bookwyrm/templates/book/edit_book.html:243 +msgid "Inventaire ID:" +msgstr "Inventaire ID:" + +#: bookwyrm/templates/author/edit_author.html:84 +msgid "Librarything key:" +msgstr "Librarything key:" + +#: bookwyrm/templates/author/edit_author.html:89 +msgid "Goodreads key:" +msgstr "Goodreads key:" + +#: bookwyrm/templates/author/edit_author.html:98 +#: bookwyrm/templates/book/book.html:124 +#: bookwyrm/templates/book/edit_book.html:263 +#: bookwyrm/templates/lists/form.html:42 +#: bookwyrm/templates/preferences/edit_user.html:70 +#: bookwyrm/templates/settings/announcement_form.html:69 +#: bookwyrm/templates/settings/edit_server.html:68 +#: bookwyrm/templates/settings/federated_server.html:98 +#: bookwyrm/templates/settings/site.html:97 +#: bookwyrm/templates/snippets/readthrough.html:77 +#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42 +#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42 +#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:34 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:38 +msgid "Save" +msgstr "儲存" + +#: bookwyrm/templates/author/edit_author.html:99 +#: bookwyrm/templates/book/book.html:125 bookwyrm/templates/book/book.html:174 +#: bookwyrm/templates/book/cover_modal.html:32 +#: bookwyrm/templates/book/edit_book.html:264 +#: bookwyrm/templates/moderation/report_modal.html:34 +#: bookwyrm/templates/settings/federated_server.html:99 +#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 +#: bookwyrm/templates/snippets/goal_form.html:32 +#: bookwyrm/templates/snippets/readthrough.html:78 +#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:43 +#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:43 +#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:35 +#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:28 +msgid "Cancel" +msgstr "取消" + +#: bookwyrm/templates/book/book.html:31 +#: bookwyrm/templates/discover/large-book.html:25 +#: bookwyrm/templates/discover/small-book.html:19 +msgid "by" +msgstr "作者" + +#: bookwyrm/templates/book/book.html:39 bookwyrm/templates/book/book.html:40 +msgid "Edit Book" +msgstr "編輯書目" + +#: bookwyrm/templates/book/book.html:57 +#: bookwyrm/templates/book/cover_modal.html:5 +msgid "Add cover" +msgstr "新增封面" + +#: bookwyrm/templates/book/book.html:61 +msgid "Failed to load cover" +msgstr "載入封面失敗" + +#: bookwyrm/templates/book/book.html:101 +#, python-format +msgid "(%(review_count)s review)" +msgid_plural "(%(review_count)s reviews)" +msgstr[0] "(%(review_count)s 則書評)" + +#: bookwyrm/templates/book/book.html:113 +msgid "Add Description" +msgstr "新增描述" + +#: bookwyrm/templates/book/book.html:120 +#: bookwyrm/templates/book/edit_book.html:108 +#: bookwyrm/templates/lists/form.html:12 +msgid "Description:" +msgstr "描述:" + +#: bookwyrm/templates/book/book.html:134 +#, python-format +msgid "%(count)s editions" +msgstr "%(count)s 個版本" + +#: bookwyrm/templates/book/book.html:142 +#, python-format +msgid "This edition is on your %(shelf_name)s shelf." +msgstr "此版本在你的 %(shelf_name)s 書架上。" + +#: bookwyrm/templates/book/book.html:148 +#, python-format +msgid "A different edition of this book is on your %(shelf_name)s shelf." +msgstr "本書的 另一個版本 在你的 %(shelf_name)s 書架上。" + +#: bookwyrm/templates/book/book.html:159 +msgid "Your reading activity" +msgstr "你的閱讀活動" + +#: bookwyrm/templates/book/book.html:162 +msgid "Add read dates" +msgstr "新增閱讀日期" + +#: bookwyrm/templates/book/book.html:171 +msgid "Create" +msgstr "建立" + +#: bookwyrm/templates/book/book.html:181 +msgid "You don't have any reading activity for this book." +msgstr "你還未閱讀這本書。" + +#: bookwyrm/templates/book/book.html:200 +msgid "Reviews" +msgstr "書評" + +#: bookwyrm/templates/book/book.html:205 +msgid "Your reviews" +msgstr "你的書評" + +#: bookwyrm/templates/book/book.html:211 +msgid "Your comments" +msgstr "你的評論" + +#: bookwyrm/templates/book/book.html:217 +msgid "Your quotes" +msgstr "你的引用" + +#: bookwyrm/templates/book/book.html:253 +msgid "Subjects" +msgstr "主題" + +#: bookwyrm/templates/book/book.html:265 +msgid "Places" +msgstr "地點" + +#: bookwyrm/templates/book/book.html:276 bookwyrm/templates/layout.html:61 +#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 +#: bookwyrm/templates/search/layout.html:25 +#: bookwyrm/templates/search/layout.html:50 +#: bookwyrm/templates/user/layout.html:68 +msgid "Lists" +msgstr "列表" + +#: bookwyrm/templates/book/book.html:287 +msgid "Add to list" +msgstr "新增到列表" + +#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/cover_modal.html:31 +#: bookwyrm/templates/lists/list.html:179 +msgid "Add" +msgstr "新增" + +#: bookwyrm/templates/book/book_identifiers.html:7 +msgid "ISBN:" +msgstr "ISBN:" + +#: bookwyrm/templates/book/book_identifiers.html:14 +#: bookwyrm/templates/book/edit_book.html:248 +msgid "OCLC Number:" +msgstr "OCLC 號:" + +#: bookwyrm/templates/book/book_identifiers.html:21 +#: bookwyrm/templates/book/edit_book.html:253 +msgid "ASIN:" +msgstr "ASIN:" + +#: bookwyrm/templates/book/cover_modal.html:17 +#: bookwyrm/templates/book/edit_book.html:192 +msgid "Upload cover:" +msgstr "上載封面:" + +#: bookwyrm/templates/book/cover_modal.html:23 +#: bookwyrm/templates/book/edit_book.html:198 +msgid "Load cover from url:" +msgstr "從網址載入封面:" + +#: bookwyrm/templates/book/edit_book.html:5 +#: bookwyrm/templates/book/edit_book.html:11 +#, python-format +msgid "Edit \"%(book_title)s\"" +msgstr "編輯 \"%(book_title)s\"" + +#: bookwyrm/templates/book/edit_book.html:5 +#: bookwyrm/templates/book/edit_book.html:13 +msgid "Add Book" +msgstr "新增書目" + +#: bookwyrm/templates/book/edit_book.html:40 +msgid "Confirm Book Info" +msgstr "確認書目資料" + +#: bookwyrm/templates/book/edit_book.html:47 +#, python-format +msgid "Is \"%(name)s\" an existing author?" +msgstr "\"%(name)s\" 是已存在的作者嗎?" + +#: bookwyrm/templates/book/edit_book.html:52 +#, python-format +msgid "Author of %(book_title)s" +msgstr "%(book_title)s 的作者" + +#: bookwyrm/templates/book/edit_book.html:55 +msgid "This is a new author" +msgstr "這是一位新的作者" + +#: bookwyrm/templates/book/edit_book.html:61 +#, python-format +msgid "Creating a new author: %(name)s" +msgstr "正在建立新的作者: %(name)s" + +#: bookwyrm/templates/book/edit_book.html:67 +msgid "Is this an edition of an existing work?" +msgstr "這是已存在的作品的另一個版本嗎?" + +#: bookwyrm/templates/book/edit_book.html:71 +msgid "This is a new work" +msgstr "這是一個新的作品。" + +#: bookwyrm/templates/book/edit_book.html:77 +#: bookwyrm/templates/password_reset.html:30 +msgid "Confirm" +msgstr "確認" + +#: bookwyrm/templates/book/edit_book.html:79 +#: bookwyrm/templates/feed/status.html:8 +msgid "Back" +msgstr "返回" + +#: bookwyrm/templates/book/edit_book.html:93 +msgid "Title:" +msgstr "標題:" + +#: bookwyrm/templates/book/edit_book.html:101 +msgid "Subtitle:" +msgstr "副標題:" + +#: bookwyrm/templates/book/edit_book.html:114 +msgid "Series:" +msgstr "系列:" + +#: bookwyrm/templates/book/edit_book.html:122 +msgid "Series number:" +msgstr "系列編號:" + +#: bookwyrm/templates/book/edit_book.html:130 +msgid "Languages:" +msgstr "語言:" + +#: bookwyrm/templates/book/edit_book.html:139 +msgid "Publisher:" +msgstr "出版社:" + +#: bookwyrm/templates/book/edit_book.html:148 +msgid "First published date:" +msgstr "初版時間:" + +#: bookwyrm/templates/book/edit_book.html:156 +msgid "Published date:" +msgstr "出版時間:" + +#: bookwyrm/templates/book/edit_book.html:165 +msgid "Authors" +msgstr "作者" + +#: bookwyrm/templates/book/edit_book.html:171 +#, python-format +msgid "Remove %(name)s" +msgstr "移除 %(name)s" + +#: bookwyrm/templates/book/edit_book.html:176 +msgid "Add Authors:" +msgstr "新增作者:" + +#: bookwyrm/templates/book/edit_book.html:177 +msgid "John Doe, Jane Smith" +msgstr "John Doe, Jane Smith" + +#: bookwyrm/templates/book/edit_book.html:183 +#: bookwyrm/templates/user/shelf/shelf.html:78 +msgid "Cover" +msgstr "封面" + +#: bookwyrm/templates/book/edit_book.html:211 +msgid "Physical Properties" +msgstr "實體性質" + +#: bookwyrm/templates/book/edit_book.html:212 +#: bookwyrm/templates/book/format_filter.html:5 +msgid "Format:" +msgstr "格式:" + +#: bookwyrm/templates/book/edit_book.html:220 +msgid "Pages:" +msgstr "頁數:" + +#: bookwyrm/templates/book/edit_book.html:227 +msgid "Book Identifiers" +msgstr "書目標識號" + +#: bookwyrm/templates/book/edit_book.html:228 +msgid "ISBN 13:" +msgstr "ISBN 13:" + +#: bookwyrm/templates/book/edit_book.html:233 +msgid "ISBN 10:" +msgstr "ISBN 10:" + +#: bookwyrm/templates/book/edit_book.html:238 +msgid "Openlibrary ID:" +msgstr "Openlibrary ID:" + +#: bookwyrm/templates/book/editions.html:4 +#, python-format +msgid "Editions of %(book_title)s" +msgstr "%(book_title)s 的各版本" + +#: bookwyrm/templates/book/editions.html:8 +#, python-format +msgid "Editions of \"%(work_title)s\"" +msgstr "\"%(work_title)s\" 的各版本" + +#: bookwyrm/templates/book/format_filter.html:8 +#: bookwyrm/templates/book/language_filter.html:8 +msgid "Any" +msgstr "所有" + +#: bookwyrm/templates/book/language_filter.html:5 +msgid "Language:" +msgstr "語言:" + +#: bookwyrm/templates/book/publisher_info.html:22 +#, python-format +msgid "%(format)s" +msgstr "%(format)s" + +#: bookwyrm/templates/book/publisher_info.html:24 +#, python-format +msgid "%(format)s, %(pages)s pages" +msgstr "%(format)s, %(pages)s 頁" + +#: bookwyrm/templates/book/publisher_info.html:26 +#, python-format +msgid "%(pages)s pages" +msgstr "%(pages)s 頁" + +#: bookwyrm/templates/book/publisher_info.html:38 +#, python-format +msgid "%(languages)s language" +msgstr "%(languages)s 語言" + +#: bookwyrm/templates/book/publisher_info.html:64 +#, python-format +msgid "Published %(date)s by %(publisher)s." +msgstr "在 %(date)s 由 %(publisher)s 出版。" + +#: bookwyrm/templates/book/publisher_info.html:66 +#, python-format +msgid "Published %(date)s" +msgstr "於 %(date)s 出版" + +#: bookwyrm/templates/book/publisher_info.html:68 +#, python-format +msgid "Published by %(publisher)s." +msgstr "由 %(publisher)s 出版。" + +#: bookwyrm/templates/book/rating.html:13 +msgid "rated it" +msgstr "評價了" + +#: bookwyrm/templates/components/inline_form.html:8 +#: bookwyrm/templates/components/modal.html:11 +#: bookwyrm/templates/feed/feed_layout.html:69 +#: bookwyrm/templates/get_started/layout.html:19 +#: bookwyrm/templates/get_started/layout.html:52 +#: bookwyrm/templates/search/book.html:32 +#: bookwyrm/templates/snippets/announcement.html:18 +msgid "Close" +msgstr "關閉" + +#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8 +msgid "Compose status" +msgstr "撰寫狀態" + +#: bookwyrm/templates/directory/community_filter.html:5 +msgid "Community" +msgstr "社群" + +#: bookwyrm/templates/directory/community_filter.html:8 +msgid "Local users" +msgstr "本地使用者" + +#: bookwyrm/templates/directory/community_filter.html:12 +msgid "Federated community" +msgstr "跨站社群" + +#: bookwyrm/templates/directory/directory.html:4 +#: bookwyrm/templates/directory/directory.html:9 +#: bookwyrm/templates/layout.html:64 +msgid "Directory" +msgstr "目錄" + +#: bookwyrm/templates/directory/directory.html:17 +msgid "Make your profile discoverable to other BookWyrm users." +msgstr "使你的使用者資料可以被其它 BookWyrm 使用者發現。" + +#: bookwyrm/templates/directory/directory.html:24 +#, python-format +msgid "You can opt-out at any time in your profile settings." +msgstr "你可以在任何時候從你的 使用者資料設定 中退出。" + +#: bookwyrm/templates/directory/directory.html:29 +#: bookwyrm/templates/snippets/announcement.html:34 +#: bookwyrm/templates/snippets/goal_card.html:22 +msgid "Dismiss message" +msgstr "關閉訊息" + +#: bookwyrm/templates/directory/sort_filter.html:5 +msgid "Order by" +msgstr "排列順序" + +#: bookwyrm/templates/directory/sort_filter.html:8 +msgid "Suggested" +msgstr "受推薦" + +#: bookwyrm/templates/directory/sort_filter.html:9 +msgid "Recently active" +msgstr "最近活躍" + +#: bookwyrm/templates/directory/user_card.html:33 +msgid "follower you follow" +msgid_plural "followers you follow" +msgstr[0] "你關注的關注者" + +#: bookwyrm/templates/directory/user_card.html:40 +msgid "book on your shelves" +msgid_plural "books on your shelves" +msgstr[0] "你書架上的書" + +#: bookwyrm/templates/directory/user_card.html:48 +msgid "posts" +msgstr "發文" + +#: bookwyrm/templates/directory/user_card.html:54 +msgid "last active" +msgstr "最後活躍" + +#: bookwyrm/templates/directory/user_type_filter.html:5 +msgid "User type" +msgstr "使用者類別" + +#: bookwyrm/templates/directory/user_type_filter.html:8 +msgid "BookWyrm users" +msgstr "BookWyrm 使用者" + +#: bookwyrm/templates/directory/user_type_filter.html:12 +msgid "All known users" +msgstr "所有已知使用者" + +#: bookwyrm/templates/discover/about.html:7 +#, python-format +msgid "About %(site_name)s" +msgstr "關於 %(site_name)s" + +#: bookwyrm/templates/discover/about.html:10 +#: bookwyrm/templates/discover/about.html:20 +msgid "Code of Conduct" +msgstr "行為準則" + +#: bookwyrm/templates/discover/about.html:13 +#: bookwyrm/templates/discover/about.html:29 +msgid "Privacy Policy" +msgstr "隱私政策" + +#: bookwyrm/templates/discover/discover.html:6 +msgid "Recent Books" +msgstr "最近書目" + +#: bookwyrm/templates/discover/landing_layout.html:5 +#: bookwyrm/templates/get_started/layout.html:4 +msgid "Welcome" +msgstr "歡迎" + +#: bookwyrm/templates/discover/landing_layout.html:17 +msgid "Decentralized" +msgstr "去中心化" + +#: bookwyrm/templates/discover/landing_layout.html:23 +msgid "Friendly" +msgstr "友好" + +#: bookwyrm/templates/discover/landing_layout.html:29 +msgid "Anti-Corporate" +msgstr "反企業" + +#: bookwyrm/templates/discover/landing_layout.html:44 +#, python-format +msgid "Join %(name)s" +msgstr "加入 %(name)s" + +#: bookwyrm/templates/discover/landing_layout.html:51 +#: bookwyrm/templates/login.html:51 +msgid "This instance is closed" +msgstr "本實例不開放。" + +#: bookwyrm/templates/discover/landing_layout.html:57 +msgid "Thank you! Your request has been received." +msgstr "謝謝你!我們已經受到了你的請求。" + +#: bookwyrm/templates/discover/landing_layout.html:60 +msgid "Request an Invitation" +msgstr "請求邀請" + +#: bookwyrm/templates/discover/landing_layout.html:64 +#: bookwyrm/templates/password_reset_request.html:18 +#: bookwyrm/templates/preferences/edit_user.html:38 +#: bookwyrm/templates/snippets/register_form.html:13 +msgid "Email address:" +msgstr "郵箱地址:" + +#: bookwyrm/templates/discover/landing_layout.html:70 +#: bookwyrm/templates/moderation/report_modal.html:33 +msgid "Submit" +msgstr "提交" + +#: bookwyrm/templates/discover/landing_layout.html:79 +msgid "Your Account" +msgstr "你的帳號" + +#: bookwyrm/templates/email/html_layout.html:15 +#: bookwyrm/templates/email/text_layout.html:2 +msgid "Hi there," +msgstr "你好呀," + +#: bookwyrm/templates/email/html_layout.html:21 +#, python-format +msgid "BookWyrm hosted on %(site_name)s" +msgstr "位於 %(site_name)s 的 BookWyrm" + +#: bookwyrm/templates/email/html_layout.html:23 +msgid "Email preference" +msgstr "郵箱偏好" + +#: bookwyrm/templates/email/invite/html_content.html:6 +#: bookwyrm/templates/email/invite/subject.html:2 +#, python-format +msgid "You're invited to join %(site_name)s!" +msgstr "你受邀請加入 %(site_name)s!" + +#: bookwyrm/templates/email/invite/html_content.html:9 +msgid "Join Now" +msgstr "立即加入" + +#: bookwyrm/templates/email/invite/html_content.html:15 +#, python-format +msgid "Learn more about this instance." +msgstr "瞭解更多 有關本實例的資訊。" + +#: bookwyrm/templates/email/invite/text_content.html:4 +#, python-format +msgid "You're invited to join %(site_name)s! Click the link below to create an account." +msgstr "你受邀請加入 %(site_name)s!點選下面的連結來建立帳號。" + +#: bookwyrm/templates/email/invite/text_content.html:8 +msgid "Learn more about this instance:" +msgstr "瞭解更多有關本實例的資訊:" + +#: bookwyrm/templates/email/password_reset/html_content.html:6 +#: bookwyrm/templates/email/password_reset/text_content.html:4 +#, python-format +msgid "You requested to reset your %(site_name)s password. Click the link below to set a new password and log in to your account." +msgstr "你請求重置你在 %(site_name)s 的密碼。點選下面的連結來設定新密碼並登入你的帳號。" + +#: bookwyrm/templates/email/password_reset/html_content.html:9 +#: bookwyrm/templates/password_reset.html:4 +#: bookwyrm/templates/password_reset.html:10 +#: bookwyrm/templates/password_reset_request.html:4 +#: bookwyrm/templates/password_reset_request.html:10 +msgid "Reset Password" +msgstr "重設密碼" + +#: bookwyrm/templates/email/password_reset/html_content.html:13 +#: bookwyrm/templates/email/password_reset/text_content.html:8 +msgid "If you didn't request to reset your password, you can ignore this email." +msgstr "如果你沒有請求重設密碼,你可以忽略這封郵件。" + +#: bookwyrm/templates/email/password_reset/subject.html:2 +#, python-format +msgid "Reset your %(site_name)s password" +msgstr "重置你在 %(site_name)s 的密碼" + +#: bookwyrm/templates/feed/direct_messages.html:8 +#, python-format +msgid "Direct Messages with %(username)s" +msgstr "與 %(username)s 私信" + +#: bookwyrm/templates/feed/direct_messages.html:10 +#: bookwyrm/templates/layout.html:92 +msgid "Direct Messages" +msgstr "私信" + +#: bookwyrm/templates/feed/direct_messages.html:13 +msgid "All messages" +msgstr "所有訊息" + +#: bookwyrm/templates/feed/direct_messages.html:22 +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)" +msgstr "載入 0 條未讀狀態" + +#: bookwyrm/templates/feed/feed.html:47 +msgid "There aren't any activities right now! Try following a user to get started" +msgstr "現在還沒有任何活動!嘗試著從關注一個使用者開始吧" + +#: bookwyrm/templates/feed/feed.html:55 +#: bookwyrm/templates/get_started/users.html:6 +msgid "Who to follow" +msgstr "可以關注的人" + +#: bookwyrm/templates/feed/feed_layout.html:4 +msgid "Updates" +msgstr "更新" + +#: bookwyrm/templates/feed/feed_layout.html:10 +#: bookwyrm/templates/user/shelf/books_header.html:3 +msgid "Your books" +msgstr "你的書目" + +#: bookwyrm/templates/feed/feed_layout.html:12 +msgid "There are no books here right now! Try searching for a book to get started" +msgstr "現在這裡還沒有任何書目!嘗試著從搜尋某本書開始吧" + +#: bookwyrm/templates/feed/feed_layout.html:23 +#: bookwyrm/templates/user/shelf/shelf.html:29 +msgid "To Read" +msgstr "想讀" + +#: bookwyrm/templates/feed/feed_layout.html:24 +#: bookwyrm/templates/user/shelf/shelf.html:29 +msgid "Currently Reading" +msgstr "在讀" + +#: bookwyrm/templates/feed/feed_layout.html:25 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:13 +#: bookwyrm/templates/user/shelf/shelf.html:29 +msgid "Read" +msgstr "讀過" + +#: bookwyrm/templates/feed/feed_layout.html:87 bookwyrm/templates/goal.html:26 +#: bookwyrm/templates/snippets/goal_card.html:6 +#, python-format +msgid "%(year)s Reading Goal" +msgstr "%(year)s 閱讀目標" + +#: bookwyrm/templates/feed/suggested_users.html:16 +#, python-format +msgid "%(mutuals)s follower you follow" +msgid_plural "%(mutuals)s followers you follow" +msgstr[0] "%(mutuals)s 個你也關注的關注者" + +#: bookwyrm/templates/feed/suggested_users.html:19 +#, python-format +msgid "%(shared_books)s book on your shelves" +msgid_plural "%(shared_books)s books on your shelves" +msgstr[0] "%(shared_books)s 本在你書架上也有的書" + +#: bookwyrm/templates/get_started/book_preview.html:6 +#, python-format +msgid "Have you read %(book_title)s?" +msgstr "你讀過 %(book_title)s 了嗎?" + +#: bookwyrm/templates/get_started/books.html:6 +msgid "What are you reading?" +msgstr "你在閱讀什麼?" + +#: bookwyrm/templates/get_started/books.html:9 +#: bookwyrm/templates/lists/list.html:135 +msgid "Search for a book" +msgstr "搜尋書目" + +#: bookwyrm/templates/get_started/books.html:11 +#: bookwyrm/templates/isbn_search_results.html:17 +#, python-format +msgid "No books found for \"%(query)s\"" +msgstr "沒有找到 \"%(query)s\" 的書目" + +#: bookwyrm/templates/get_started/books.html:11 +#, python-format +msgid "You can add books when you start using %(site_name)s." +msgstr "你可以在開始使用 %(site_name)s 後新增書目。" + +#: bookwyrm/templates/get_started/books.html:16 +#: bookwyrm/templates/get_started/books.html:17 +#: bookwyrm/templates/get_started/users.html:18 +#: bookwyrm/templates/get_started/users.html:19 +#: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38 +#: bookwyrm/templates/lists/list.html:139 +#: bookwyrm/templates/search/layout.html:4 +#: bookwyrm/templates/search/layout.html:9 +msgid "Search" +msgstr "搜尋" + +#: bookwyrm/templates/get_started/books.html:27 +msgid "Suggested Books" +msgstr "推薦的書目" + +#: bookwyrm/templates/get_started/books.html:46 +#, python-format +msgid "Popular on %(site_name)s" +msgstr "%(site_name)s 上的熱門" + +#: bookwyrm/templates/get_started/books.html:58 +#: bookwyrm/templates/lists/list.html:152 +msgid "No books found" +msgstr "沒有找到書目" + +#: bookwyrm/templates/get_started/books.html:63 +#: bookwyrm/templates/get_started/profile.html:54 +msgid "Save & continue" +msgstr "儲存 & 繼續" + +#: bookwyrm/templates/get_started/layout.html:14 +#, python-format +msgid "Welcome to %(site_name)s!" +msgstr "歡迎來到 %(site_name)s!" + +#: bookwyrm/templates/get_started/layout.html:16 +msgid "These are some first steps to get you started." +msgstr "這些最初的步驟可以幫助你入門。" + +#: bookwyrm/templates/get_started/layout.html:30 +#: bookwyrm/templates/get_started/profile.html:6 +msgid "Create your profile" +msgstr "建立你的使用者資料" + +#: bookwyrm/templates/get_started/layout.html:34 +msgid "Add books" +msgstr "新增書目" + +#: bookwyrm/templates/get_started/layout.html:38 +msgid "Find friends" +msgstr "尋找同好" + +#: bookwyrm/templates/get_started/layout.html:44 +msgid "Skip this step" +msgstr "跳過此步驟" + +#: bookwyrm/templates/get_started/layout.html:48 +msgid "Finish" +msgstr "完成" + +#: bookwyrm/templates/get_started/profile.html:15 +#: bookwyrm/templates/preferences/edit_user.html:24 +msgid "Display name:" +msgstr "顯示名稱:" + +#: bookwyrm/templates/get_started/profile.html:22 +#: bookwyrm/templates/preferences/edit_user.html:31 +msgid "Summary:" +msgstr "概要:" + +#: bookwyrm/templates/get_started/profile.html:23 +msgid "A little bit about you" +msgstr "少許關於你的資訊" + +#: bookwyrm/templates/get_started/profile.html:32 +#: bookwyrm/templates/preferences/edit_user.html:17 +msgid "Avatar:" +msgstr "頭像:" + +#: bookwyrm/templates/get_started/profile.html:42 +#: bookwyrm/templates/preferences/edit_user.html:52 +msgid "Manually approve followers:" +msgstr "手動批准關注者:" + +#: bookwyrm/templates/get_started/profile.html:48 +#: bookwyrm/templates/preferences/edit_user.html:58 +msgid "Show this account in suggested users:" +msgstr "在推薦的使用者中顯示此帳號:" + +#: bookwyrm/templates/get_started/profile.html:52 +msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." +msgstr "你的帳號會顯示在目錄中,並且可能會受其它 BookWyrm 使用者推薦。" + +#: bookwyrm/templates/get_started/users.html:11 +msgid "Search for a user" +msgstr "搜尋使用者" + +#: bookwyrm/templates/get_started/users.html:13 +#, python-format +msgid "No users found for \"%(query)s\"" +msgstr "沒有找到 \"%(query)s\" 的使用者" + +#: bookwyrm/templates/goal.html:7 +#, python-format +msgid "%(year)s Reading Progress" +msgstr "%(year)s 閱讀進度" + +#: bookwyrm/templates/goal.html:11 +msgid "Edit Goal" +msgstr "編輯目標" + +#: bookwyrm/templates/goal.html:30 +#: bookwyrm/templates/snippets/goal_card.html:13 +#, python-format +msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." +msgstr "設定一個 %(year)s 內要讀多少書的目標,並記錄你全年的進度。" + +#: bookwyrm/templates/goal.html:39 +#, python-format +msgid "%(name)s hasn't set a reading goal for %(year)s." +msgstr "%(name)s 還沒有設定 %(year)s 的閱讀目標。" + +#: bookwyrm/templates/goal.html:51 +#, python-format +msgid "Your %(year)s Books" +msgstr "你 %(year)s 的書目" + +#: bookwyrm/templates/goal.html:53 +#, python-format +msgid "%(username)s's %(year)s Books" +msgstr "%(username)s 在 %(year)s 的書目" + +#: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9 +#: bookwyrm/templates/user/shelf/shelf.html:40 +msgid "Import Books" +msgstr "匯入書目" + +#: bookwyrm/templates/import.html:16 +msgid "Data source:" +msgstr "資料來源:" + +#: bookwyrm/templates/import.html:32 +msgid "Data file:" +msgstr "資料檔案:" + +#: bookwyrm/templates/import.html:40 +msgid "Include reviews" +msgstr "納入書評" + +#: bookwyrm/templates/import.html:45 +msgid "Privacy setting for imported reviews:" +msgstr "匯入書評的隱私設定" + +#: bookwyrm/templates/import.html:51 +#: bookwyrm/templates/settings/server_blocklist.html:64 +msgid "Import" +msgstr "匯入" + +#: bookwyrm/templates/import.html:56 +msgid "Recent Imports" +msgstr "最近的匯入" + +#: bookwyrm/templates/import.html:58 +msgid "No recent imports" +msgstr "無最近的匯入" + +#: bookwyrm/templates/import_status.html:5 +#: bookwyrm/templates/import_status.html:9 +msgid "Import Status" +msgstr "匯入狀態" + +#: bookwyrm/templates/import_status.html:12 +msgid "Import started:" +msgstr "匯入開始:" + +#: bookwyrm/templates/import_status.html:16 +msgid "Import completed:" +msgstr "匯入完成:" + +#: bookwyrm/templates/import_status.html:19 +msgid "TASK FAILED" +msgstr "任務失敗" + +#: bookwyrm/templates/import_status.html:25 +msgid "Import still in progress." +msgstr "還在匯入中。" + +#: bookwyrm/templates/import_status.html:27 +msgid "(Hit reload to update!)" +msgstr "(按下重新載入來更新!)" + +#: bookwyrm/templates/import_status.html:34 +msgid "Failed to load" +msgstr "載入失敗" + +#: bookwyrm/templates/import_status.html:43 +#, python-format +msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import." +msgstr "跳轉至列表底部來選取 %(failed_count)s 個匯入失敗的項目。" + +#: bookwyrm/templates/import_status.html:78 +msgid "Select all" +msgstr "全選" + +#: bookwyrm/templates/import_status.html:81 +msgid "Retry items" +msgstr "重試項目" + +#: bookwyrm/templates/import_status.html:107 +msgid "Successfully imported" +msgstr "成功匯入了" + +#: bookwyrm/templates/import_status.html:111 +msgid "Book" +msgstr "書目" + +#: bookwyrm/templates/import_status.html:114 +#: bookwyrm/templates/snippets/create_status_form.html:13 +#: bookwyrm/templates/user/shelf/shelf.html:79 +#: bookwyrm/templates/user/shelf/shelf.html:99 +msgid "Title" +msgstr "標題" + +#: bookwyrm/templates/import_status.html:117 +#: bookwyrm/templates/user/shelf/shelf.html:80 +#: bookwyrm/templates/user/shelf/shelf.html:102 +msgid "Author" +msgstr "作者" + +#: bookwyrm/templates/import_status.html:140 +msgid "Imported" +msgstr "已匯入" + +#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12 +#: bookwyrm/templates/login.html:46 +msgid "Create an Account" +msgstr "建立帳號" + +#: bookwyrm/templates/invite.html:21 +msgid "Permission Denied" +msgstr "沒有權限" + +#: bookwyrm/templates/invite.html:22 +msgid "Sorry! This invite code is no longer valid." +msgstr "抱歉!此邀請碼已不再有效。" + +#: bookwyrm/templates/isbn_search_results.html:4 +msgid "Search Results" +msgstr "搜尋結果" + +#: bookwyrm/templates/isbn_search_results.html:9 +#, python-format +msgid "Search Results for \"%(query)s\"" +msgstr "\"%(query)s\" 的搜尋結果" + +#: bookwyrm/templates/isbn_search_results.html:14 +msgid "Matching Books" +msgstr "匹配的書目" + +#: bookwyrm/templates/layout.html:33 +msgid "Search for a book or user" +msgstr "搜尋書目或使用者" + +#: bookwyrm/templates/layout.html:47 bookwyrm/templates/layout.html:48 +msgid "Main navigation menu" +msgstr "主導航選單" + +#: bookwyrm/templates/layout.html:58 +msgid "Feed" +msgstr "動態" + +#: bookwyrm/templates/layout.html:87 +msgid "Your Books" +msgstr "你的書目" + +#: bookwyrm/templates/layout.html:97 +msgid "Settings" +msgstr "設定" + +#: bookwyrm/templates/layout.html:106 +#: bookwyrm/templates/settings/admin_layout.html:31 +#: bookwyrm/templates/settings/manage_invite_requests.html:15 +#: bookwyrm/templates/settings/manage_invites.html:3 +#: bookwyrm/templates/settings/manage_invites.html:15 +msgid "Invites" +msgstr "邀請" + +#: bookwyrm/templates/layout.html:113 +msgid "Admin" +msgstr "管理員" + +#: bookwyrm/templates/layout.html:120 +msgid "Log out" +msgstr "登出" + +#: bookwyrm/templates/layout.html:128 bookwyrm/templates/layout.html:129 +#: bookwyrm/templates/notifications.html:6 +#: bookwyrm/templates/notifications.html:11 +msgid "Notifications" +msgstr "通知" + +#: bookwyrm/templates/layout.html:151 bookwyrm/templates/layout.html:155 +#: bookwyrm/templates/login.html:17 +#: bookwyrm/templates/snippets/register_form.html:4 +msgid "Username:" +msgstr "使用者名稱:" + +#: bookwyrm/templates/layout.html:156 +msgid "password" +msgstr "密碼" + +#: bookwyrm/templates/layout.html:157 bookwyrm/templates/login.html:36 +msgid "Forgot your password?" +msgstr "忘記了密碼?" + +#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:10 +#: bookwyrm/templates/login.html:33 +msgid "Log in" +msgstr "登入" + +#: bookwyrm/templates/layout.html:168 +msgid "Join" +msgstr "加入" + +#: bookwyrm/templates/layout.html:206 +msgid "About this instance" +msgstr "關於本實例" + +#: bookwyrm/templates/layout.html:210 +msgid "Contact site admin" +msgstr "聯絡網站管理員" + +#: bookwyrm/templates/layout.html:214 +msgid "Documentation" +msgstr "文件:" + +#: bookwyrm/templates/layout.html:221 +#, python-format +msgid "Support %(site_name)s on %(support_title)s" +msgstr "在 %(support_title)s 上支援 %(site_name)s" + +#: bookwyrm/templates/layout.html:225 +msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub." +msgstr "BookWyrm 是開源軟體。你可以在 GitHub 貢獻或報告問題。" + +#: bookwyrm/templates/lists/create_form.html:5 +#: bookwyrm/templates/lists/lists.html:20 +msgid "Create List" +msgstr "建立列表" + +#: bookwyrm/templates/lists/created_text.html:5 +#, python-format +msgid "Created and curated by %(username)s" +msgstr "由 %(username)s 建立並管理" + +#: bookwyrm/templates/lists/created_text.html:7 +#, python-format +msgid "Created by %(username)s" +msgstr "由 %(username)s 建立" + +#: bookwyrm/templates/lists/curate.html:8 +msgid "Pending Books" +msgstr "等候中的書目" + +#: bookwyrm/templates/lists/curate.html:11 +msgid "Go to list" +msgstr "前往列表" + +#: bookwyrm/templates/lists/curate.html:15 +msgid "You're all set!" +msgstr "都弄好了!" + +#: bookwyrm/templates/lists/curate.html:45 +msgid "Suggested by" +msgstr "推薦來自" + +#: bookwyrm/templates/lists/curate.html:57 +msgid "Approve" +msgstr "批准" + +#: bookwyrm/templates/lists/curate.html:63 +msgid "Discard" +msgstr "放棄" + +#: bookwyrm/templates/lists/edit_form.html:5 +#: bookwyrm/templates/lists/list_layout.html:16 +msgid "Edit List" +msgstr "編輯列表" + +#: bookwyrm/templates/lists/form.html:18 +msgid "List curation:" +msgstr "列表管理:" + +#: bookwyrm/templates/lists/form.html:21 +msgid "Closed" +msgstr "已關閉" + +#: bookwyrm/templates/lists/form.html:22 +msgid "Only you can add and remove books to this list" +msgstr "只有你可以在此列表中新增或移除書目" + +#: bookwyrm/templates/lists/form.html:26 +msgid "Curated" +msgstr "管理" + +#: bookwyrm/templates/lists/form.html:27 +msgid "Anyone can suggest books, subject to your approval" +msgstr "任何人都可以推薦書目、主題,但須經你的批准。" + +#: bookwyrm/templates/lists/form.html:31 +#: bookwyrm/templates/moderation/reports.html:25 +#: bookwyrm/templates/search/book.html:30 +#: bookwyrm/templates/snippets/announcement.html:16 +msgid "Open" +msgstr "開放" + +#: bookwyrm/templates/lists/form.html:32 +msgid "Anyone can add books to this list" +msgstr "任何人都可以向此列表新增書目" + +#: bookwyrm/templates/lists/list.html:20 +msgid "You successfully suggested a book for this list!" +msgstr "你成功!向該列表推薦了一本書" + +#: bookwyrm/templates/lists/list.html:22 +msgid "You successfully added a book to this list!" +msgstr "你成功在此列表新增了一本書!" + +#: bookwyrm/templates/lists/list.html:28 +msgid "This list is currently empty" +msgstr "此列表當前是空的" + +#: bookwyrm/templates/lists/list.html:66 +#, python-format +msgid "Added by %(username)s" +msgstr "由 %(username)s 新增" + +#: bookwyrm/templates/lists/list.html:74 +msgid "List position" +msgstr "列表位置:" + +#: bookwyrm/templates/lists/list.html:81 +msgid "Set" +msgstr "設定" + +#: bookwyrm/templates/lists/list.html:89 +#: bookwyrm/templates/snippets/shelf_selector.html:26 +msgid "Remove" +msgstr "移除" + +#: bookwyrm/templates/lists/list.html:103 +#: bookwyrm/templates/lists/list.html:120 +msgid "Sort List" +msgstr "排序列表" + +#: bookwyrm/templates/lists/list.html:113 +msgid "Direction" +msgstr "方向" + +#: bookwyrm/templates/lists/list.html:127 +msgid "Add Books" +msgstr "新增書目" + +#: bookwyrm/templates/lists/list.html:129 +msgid "Suggest Books" +msgstr "推薦書目" + +#: bookwyrm/templates/lists/list.html:140 +msgid "search" +msgstr "搜尋" + +#: bookwyrm/templates/lists/list.html:146 +msgid "Clear search" +msgstr "清除搜尋" + +#: bookwyrm/templates/lists/list.html:151 +#, python-format +msgid "No books found matching the query \"%(query)s\"" +msgstr "沒有符合 \"%(query)s\" 請求的書目" + +#: bookwyrm/templates/lists/list.html:179 +msgid "Suggest" +msgstr "推薦" + +#: bookwyrm/templates/lists/lists.html:14 bookwyrm/templates/user/lists.html:9 +msgid "Your Lists" +msgstr "你的列表" + +#: bookwyrm/templates/login.html:4 +msgid "Login" +msgstr "登入" + +#: bookwyrm/templates/login.html:23 bookwyrm/templates/password_reset.html:17 +#: bookwyrm/templates/snippets/register_form.html:22 +msgid "Password:" +msgstr "密碼:" + +#: bookwyrm/templates/login.html:52 +msgid "Contact an administrator to get an invite" +msgstr "聯絡管理員以取得邀請" + +#: bookwyrm/templates/login.html:63 +msgid "More about this site" +msgstr "關於本網站的更多" + +#: bookwyrm/templates/moderation/report.html:5 +#: bookwyrm/templates/moderation/report.html:6 +#: bookwyrm/templates/moderation/report_preview.html:6 +#, python-format +msgid "Report #%(report_id)s: %(username)s" +msgstr "舉報 #%(report_id)s: %(username)s" + +#: bookwyrm/templates/moderation/report.html:10 +msgid "Back to reports" +msgstr "回到舉報" + +#: bookwyrm/templates/moderation/report.html:22 +msgid "Moderator Comments" +msgstr "監察員評論" + +#: bookwyrm/templates/moderation/report.html:40 +#: bookwyrm/templates/snippets/create_status.html:28 +#: bookwyrm/templates/snippets/create_status_form.html:66 +msgid "Comment" +msgstr "評論" + +#: bookwyrm/templates/moderation/report.html:45 +msgid "Reported statuses" +msgstr "被舉報的狀態" + +#: bookwyrm/templates/moderation/report.html:47 +msgid "No statuses reported" +msgstr "沒有被舉報的狀態" + +#: bookwyrm/templates/moderation/report.html:53 +msgid "Status has been deleted" +msgstr "狀態已被刪除" + +#: bookwyrm/templates/moderation/report_modal.html:6 +#, python-format +msgid "Report @%(username)s" +msgstr "舉報 %(username)s" + +#: bookwyrm/templates/moderation/report_modal.html:23 +#, python-format +msgid "This report will be sent to %(site_name)s's moderators for review." +msgstr "本舉報會被發送至 %(site_name)s 的監察員以複查。" + +#: bookwyrm/templates/moderation/report_modal.html:24 +msgid "More info about this report:" +msgstr "關於本舉報的更多資訊" + +#: bookwyrm/templates/moderation/report_preview.html:13 +msgid "No notes provided" +msgstr "沒有提供摘記" + +#: bookwyrm/templates/moderation/report_preview.html:20 +#, python-format +msgid "Reported by %(username)s" +msgstr "由 %(username)s 舉報" + +#: bookwyrm/templates/moderation/report_preview.html:30 +msgid "Re-open" +msgstr "重新開啟" + +#: bookwyrm/templates/moderation/report_preview.html:32 +msgid "Resolve" +msgstr "已解決" + +#: bookwyrm/templates/moderation/reports.html:6 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "舉報: %(instance_name)s" + +#: bookwyrm/templates/moderation/reports.html:8 +#: bookwyrm/templates/moderation/reports.html:17 +#: bookwyrm/templates/settings/admin_layout.html:35 +msgid "Reports" +msgstr "舉報" + +#: bookwyrm/templates/moderation/reports.html:14 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "舉報: %(instance_name)s" + +#: bookwyrm/templates/moderation/reports.html:28 +msgid "Resolved" +msgstr "已解決" + +#: bookwyrm/templates/moderation/reports.html:37 +msgid "No reports found." +msgstr "沒有找到舉報" + +#: bookwyrm/templates/notifications.html:16 +msgid "Delete notifications" +msgstr "刪除通知" + +#: bookwyrm/templates/notifications.html:25 +msgid "All" +msgstr "所有" + +#: bookwyrm/templates/notifications.html:29 +msgid "Mentions" +msgstr "提及" + +#: bookwyrm/templates/notifications.html:70 +#, python-format +msgid "favorited your review of %(book_title)s" +msgstr "喜歡了你 %(book_title)s 的書評" + +#: bookwyrm/templates/notifications.html:72 +#, python-format +msgid "favorited your comment on %(book_title)s" +msgstr "喜歡了你 %(book_title)s 的評論" + +#: bookwyrm/templates/notifications.html:74 +#, python-format +msgid "favorited your quote from %(book_title)s" +msgstr "喜歡了你 來自 %(book_title)s 的引用" + +#: bookwyrm/templates/notifications.html:76 +#, python-format +msgid "favorited your status" +msgstr "喜歡了你的 狀態" + +#: bookwyrm/templates/notifications.html:81 +#, python-format +msgid "mentioned you in a review of %(book_title)s" +msgstr "在 %(book_title)s 的書評 裡提到了你" + +#: bookwyrm/templates/notifications.html:83 +#, python-format +msgid "mentioned you in a comment on %(book_title)s" +msgstr "在 %(book_title)s 的評論 裡提到了你" + +#: bookwyrm/templates/notifications.html:85 +#, python-format +msgid "mentioned you in a quote from %(book_title)s" +msgstr "在 %(book_title)s 的引用 中提到了你" + +#: bookwyrm/templates/notifications.html:87 +#, python-format +msgid "mentioned you in a status" +msgstr "在 狀態 中提到了你" + +#: bookwyrm/templates/notifications.html:92 +#, python-format +msgid "replied to your review of %(book_title)s" +msgstr "回覆 了你的 %(book_title)s 的書評" + +#: bookwyrm/templates/notifications.html:94 +#, python-format +msgid "replied to your comment on %(book_title)s" +msgstr "回覆 了你的 %(book_title)s 的評論" + +#: bookwyrm/templates/notifications.html:96 +#, python-format +msgid "replied to your quote from %(book_title)s" +msgstr "回覆 了你 %(book_title)s 中的引用" + +#: bookwyrm/templates/notifications.html:98 +#, python-format +msgid "replied to your status" +msgstr "回覆 了你的 狀態" + +#: bookwyrm/templates/notifications.html:102 +msgid "followed you" +msgstr "關注了你" + +#: bookwyrm/templates/notifications.html:105 +msgid "sent you a follow request" +msgstr "向你傳送了關注請求" + +#: bookwyrm/templates/notifications.html:111 +#, python-format +msgid "boosted your review of %(book_title)s" +msgstr "轉發了你的 %(book_title)s 的書評" + +#: bookwyrm/templates/notifications.html:113 +#, python-format +msgid "boosted your comment on%(book_title)s" +msgstr "轉發了你的 %(book_title)s 的評論" + +#: bookwyrm/templates/notifications.html:115 +#, python-format +msgid "boosted your quote from %(book_title)s" +msgstr "轉發了你的 %(book_title)s 的引用" + +#: bookwyrm/templates/notifications.html:117 +#, python-format +msgid "boosted your status" +msgstr "轉發了你的 狀態" + +#: bookwyrm/templates/notifications.html:121 +#, python-format +msgid " added %(book_title)s to your list \"%(list_name)s\"" +msgstr " 新增了 %(book_title)s 到你的列表 \"%(list_name)s\"" + +#: bookwyrm/templates/notifications.html:123 +#, python-format +msgid " suggested adding %(book_title)s to your list \"%(list_name)s\"" +msgstr " 推薦新增 %(book_title)s 到你的列表 \"%(list_name)s\"" + +#: bookwyrm/templates/notifications.html:128 +#, python-format +msgid "Your import completed." +msgstr "你的 匯入 已完成。" + +#: bookwyrm/templates/notifications.html:131 +#, python-format +msgid "A new report needs moderation." +msgstr "有新的 舉報 需要仲裁。" + +#: bookwyrm/templates/notifications.html:157 +msgid "You're all caught up!" +msgstr "你什麼也沒錯過!" + +#: bookwyrm/templates/password_reset.html:23 +#: bookwyrm/templates/preferences/change_password.html:18 +msgid "Confirm password:" +msgstr "確認密碼:" + +#: bookwyrm/templates/password_reset_request.html:14 +msgid "A link to reset your password will be sent to your email address" +msgstr "重設你的密碼的連結將會被發送到你的郵箱地址" + +#: bookwyrm/templates/password_reset_request.html:28 +msgid "Reset password" +msgstr "重設密碼" + +#: bookwyrm/templates/preferences/blocks.html:4 +#: bookwyrm/templates/preferences/blocks.html:7 +#: bookwyrm/templates/preferences/preferences_layout.html:26 +msgid "Blocked Users" +msgstr "封鎖的使用者" + +#: bookwyrm/templates/preferences/blocks.html:12 +msgid "No users currently blocked." +msgstr "當前沒有被封鎖的使用者。" + +#: bookwyrm/templates/preferences/change_password.html:4 +#: bookwyrm/templates/preferences/change_password.html:7 +#: bookwyrm/templates/preferences/change_password.html:21 +#: bookwyrm/templates/preferences/preferences_layout.html:19 +msgid "Change Password" +msgstr "更改密碼" + +#: bookwyrm/templates/preferences/change_password.html:14 +msgid "New password:" +msgstr "新密碼:" + +#: bookwyrm/templates/preferences/edit_user.html:4 +#: bookwyrm/templates/preferences/edit_user.html:7 +msgid "Edit Profile" +msgstr "編輯使用者資料" + +#: bookwyrm/templates/preferences/edit_user.html:46 +msgid "Show set reading goal prompt in feed:" +msgstr "在即時動態中顯示設定的閱讀目標提示:" + +#: bookwyrm/templates/preferences/edit_user.html:62 +#, python-format +msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." +msgstr "你的帳號會顯示在 目錄 中,並可能受其它 BookWyrm 使用者推薦。" + +#: bookwyrm/templates/preferences/edit_user.html:65 +msgid "Preferred Timezone: " +msgstr "偏好時區:" + +#: bookwyrm/templates/preferences/preferences_layout.html:11 +msgid "Account" +msgstr "帳號" + +#: bookwyrm/templates/preferences/preferences_layout.html:15 +msgid "Profile" +msgstr "使用者資料" + +#: bookwyrm/templates/preferences/preferences_layout.html:22 +msgid "Relationships" +msgstr "關係" + +#: bookwyrm/templates/rss/title.html:5 +#: bookwyrm/templates/snippets/status/status_header.html:35 +msgid "rated" +msgstr "評價了" + +#: bookwyrm/templates/rss/title.html:7 +#: bookwyrm/templates/snippets/status/status_header.html:37 +msgid "reviewed" +msgstr "寫了書評給" + +#: bookwyrm/templates/rss/title.html:9 +#: bookwyrm/templates/snippets/status/status_header.html:39 +msgid "commented on" +msgstr "評論了" + +#: bookwyrm/templates/rss/title.html:11 +#: bookwyrm/templates/snippets/status/status_header.html:41 +msgid "quoted" +msgstr "引用了" + +#: bookwyrm/templates/search/book.html:64 +msgid "Load results from other catalogues" +msgstr "從其它分類載入結果" + +#: bookwyrm/templates/search/book.html:68 +msgid "Manually add book" +msgstr "手動新增書目" + +#: bookwyrm/templates/search/book.html:73 +msgid "Log in to import or add books." +msgstr "登陸以匯入或新增書目。" + +#: bookwyrm/templates/search/layout.html:16 +msgid "Search query" +msgstr "搜尋請求" + +#: bookwyrm/templates/search/layout.html:19 +msgid "Search type" +msgstr "搜尋類別" + +#: bookwyrm/templates/search/layout.html:21 +#: bookwyrm/templates/search/layout.html:42 +#: bookwyrm/templates/user/layout.html:74 +msgid "Books" +msgstr "書目" + +#: bookwyrm/templates/search/layout.html:23 +#: bookwyrm/templates/search/layout.html:46 +#: bookwyrm/templates/settings/admin_layout.html:26 +#: bookwyrm/templates/user_admin/user_admin.html:3 +#: bookwyrm/templates/user_admin/user_admin.html:10 +msgid "Users" +msgstr "使用者" + +#: bookwyrm/templates/search/layout.html:58 +#, python-format +msgid "No results found for \"%(query)s\"" +msgstr "沒有找到 \"%(query)s\" 的搜尋結果" + +#: bookwyrm/templates/settings/admin_layout.html:4 +msgid "Administration" +msgstr "管理" + +#: bookwyrm/templates/settings/admin_layout.html:22 +msgid "Manage Users" +msgstr "管理使用者" + +#: bookwyrm/templates/settings/admin_layout.html:39 +#: bookwyrm/templates/settings/federation.html:3 +#: bookwyrm/templates/settings/federation.html:5 +msgid "Federated Instances" +msgstr "聯合實例" + +#: bookwyrm/templates/settings/admin_layout.html:44 +msgid "Instance Settings" +msgstr "實例設定" + +#: bookwyrm/templates/settings/admin_layout.html:48 +#: bookwyrm/templates/settings/announcements.html:3 +#: bookwyrm/templates/settings/announcements.html:5 +msgid "Announcements" +msgstr "公告" + +#: bookwyrm/templates/settings/admin_layout.html:52 +#: bookwyrm/templates/settings/site.html:4 +#: bookwyrm/templates/settings/site.html:6 +msgid "Site Settings" +msgstr "網站設定" + +#: bookwyrm/templates/settings/admin_layout.html:55 +#: bookwyrm/templates/settings/site.html:13 +msgid "Instance Info" +msgstr "實例資訊" + +#: bookwyrm/templates/settings/admin_layout.html:56 +#: bookwyrm/templates/settings/site.html:39 +msgid "Images" +msgstr "圖片" + +#: bookwyrm/templates/settings/admin_layout.html:57 +#: bookwyrm/templates/settings/site.html:59 +msgid "Footer Content" +msgstr "頁尾內容" + +#: bookwyrm/templates/settings/admin_layout.html:58 +#: bookwyrm/templates/settings/site.html:81 +msgid "Registration" +msgstr "註冊" + +#: bookwyrm/templates/settings/announcement.html:3 +#: bookwyrm/templates/settings/announcement.html:6 +msgid "Announcement" +msgstr "公告" + +#: bookwyrm/templates/settings/announcement.html:7 +#: bookwyrm/templates/settings/federated_server.html:13 +msgid "Back to list" +msgstr "回到列表" + +#: bookwyrm/templates/settings/announcement.html:11 +#: bookwyrm/templates/settings/announcement_form.html:6 +msgid "Edit Announcement" +msgstr "編輯公告" + +#: bookwyrm/templates/settings/announcement.html:20 +#: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 +#: bookwyrm/templates/snippets/follow_request_buttons.html:12 +msgid "Delete" +msgstr "刪除" + +#: bookwyrm/templates/settings/announcement.html:35 +msgid "Visible:" +msgstr "可見:" + +#: bookwyrm/templates/settings/announcement.html:38 +msgid "True" +msgstr "是" + +#: bookwyrm/templates/settings/announcement.html:40 +msgid "False" +msgstr "否" + +#: bookwyrm/templates/settings/announcement.html:47 +msgid "Start date:" +msgstr "開始日期:" + +#: bookwyrm/templates/settings/announcement.html:54 +msgid "End date:" +msgstr "結束日期:" + +#: bookwyrm/templates/settings/announcement.html:60 +msgid "Active:" +msgstr "活躍:" + +#: bookwyrm/templates/settings/announcement_form.html:8 +#: bookwyrm/templates/settings/announcements.html:8 +msgid "Create Announcement" +msgstr "建立公告" + +#: bookwyrm/templates/settings/announcements.html:22 +msgid "Date added" +msgstr "新增日期:" + +#: bookwyrm/templates/settings/announcements.html:26 +msgid "Preview" +msgstr "預覽" + +#: bookwyrm/templates/settings/announcements.html:30 +msgid "Start date" +msgstr "開始日期" + +#: bookwyrm/templates/settings/announcements.html:34 +msgid "End date" +msgstr "結束日期" + +#: bookwyrm/templates/settings/announcements.html:38 +#: bookwyrm/templates/settings/federation.html:30 +#: bookwyrm/templates/settings/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/status_filter.html:5 +#: bookwyrm/templates/user_admin/user_admin.html:34 +msgid "Status" +msgstr "狀態" + +#: bookwyrm/templates/settings/announcements.html:48 +msgid "active" +msgstr "啟用" + +#: bookwyrm/templates/settings/announcements.html:48 +msgid "inactive" +msgstr "停用" + +#: bookwyrm/templates/settings/edit_server.html:3 +#: bookwyrm/templates/settings/edit_server.html:6 +#: bookwyrm/templates/settings/edit_server.html:20 +#: bookwyrm/templates/settings/federation.html:9 +#: bookwyrm/templates/settings/federation.html:10 +#: bookwyrm/templates/settings/server_blocklist.html:3 +#: bookwyrm/templates/settings/server_blocklist.html:20 +msgid "Add instance" +msgstr "新增實例" + +#: bookwyrm/templates/settings/edit_server.html:7 +#: bookwyrm/templates/settings/server_blocklist.html:7 +msgid "Back to instance list" +msgstr "回到實例列表" + +#: bookwyrm/templates/settings/edit_server.html:16 +#: bookwyrm/templates/settings/server_blocklist.html:16 +msgid "Import block list" +msgstr "匯入封鎖列表" + +#: bookwyrm/templates/settings/edit_server.html:30 +msgid "Instance:" +msgstr "實例:" + +#: bookwyrm/templates/settings/edit_server.html:37 +#: bookwyrm/templates/settings/federated_server.html:31 +#: bookwyrm/templates/user_admin/user_info.html:34 +msgid "Status:" +msgstr "狀態:" + +#: bookwyrm/templates/settings/edit_server.html:41 +#: bookwyrm/templates/settings/federated_server.html:10 +msgid "Blocked" +msgstr "已封鎖" + +#: bookwyrm/templates/settings/edit_server.html:48 +#: bookwyrm/templates/settings/federated_server.html:23 +#: bookwyrm/templates/user_admin/user_info.html:26 +msgid "Software:" +msgstr "軟件:" + +#: bookwyrm/templates/settings/edit_server.html:55 +#: bookwyrm/templates/settings/federated_server.html:27 +#: bookwyrm/templates/user_admin/user_info.html:30 +msgid "Version:" +msgstr "版本:" + +#: bookwyrm/templates/settings/edit_server.html:64 +msgid "Notes:" +msgstr "備註:" + +#: bookwyrm/templates/settings/federated_server.html:19 +msgid "Details" +msgstr "詳細" + +#: bookwyrm/templates/settings/federated_server.html:39 +#: bookwyrm/templates/user/layout.html:56 +msgid "Activity" +msgstr "活動" + +#: bookwyrm/templates/settings/federated_server.html:43 +msgid "Users:" +msgstr "使用者:" + +#: bookwyrm/templates/settings/federated_server.html:46 +#: bookwyrm/templates/settings/federated_server.html:53 +msgid "View all" +msgstr "檢視全部" + +#: bookwyrm/templates/settings/federated_server.html:50 +msgid "Reports:" +msgstr "舉報:" + +#: bookwyrm/templates/settings/federated_server.html:57 +msgid "Followed by us:" +msgstr "我們關注了的:" + +#: bookwyrm/templates/settings/federated_server.html:63 +msgid "Followed by them:" +msgstr "TA 們關注了的:" + +#: bookwyrm/templates/settings/federated_server.html:69 +msgid "Blocked by us:" +msgstr "我們所封鎖的:" + +#: bookwyrm/templates/settings/federated_server.html:82 +#: bookwyrm/templates/user_admin/user_info.html:39 +msgid "Notes" +msgstr "備註" + +#: bookwyrm/templates/settings/federated_server.html:85 +msgid "Edit" +msgstr "編輯" + +#: bookwyrm/templates/settings/federated_server.html:105 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:3 +msgid "Actions" +msgstr "動作" + +#: bookwyrm/templates/settings/federated_server.html:109 +#: bookwyrm/templates/snippets/block_button.html:5 +msgid "Block" +msgstr "封鎖" + +#: bookwyrm/templates/settings/federated_server.html:110 +msgid "All users from this instance will be deactivated." +msgstr "來自此實例的所有使用者將會被停用。" + +#: bookwyrm/templates/settings/federated_server.html:115 +#: bookwyrm/templates/snippets/block_button.html:10 +msgid "Un-block" +msgstr "取消封鎖" + +#: bookwyrm/templates/settings/federated_server.html:116 +msgid "All users from this instance will be re-activated." +msgstr "來自此實例的所有使用者將會被重新啟用。" + +#: bookwyrm/templates/settings/federation.html:19 +#: bookwyrm/templates/user_admin/server_filter.html:5 +msgid "Instance name" +msgstr "實例名稱" + +#: bookwyrm/templates/settings/federation.html:23 +msgid "Date federated" +msgstr "跨站日期" + +#: bookwyrm/templates/settings/federation.html:27 +msgid "Software" +msgstr "軟體" + +#: bookwyrm/templates/settings/manage_invite_requests.html:4 +#: bookwyrm/templates/settings/manage_invite_requests.html:11 +#: bookwyrm/templates/settings/manage_invite_requests.html:25 +#: bookwyrm/templates/settings/manage_invites.html:11 +msgid "Invite Requests" +msgstr "邀請請求" + +#: bookwyrm/templates/settings/manage_invite_requests.html:23 +msgid "Ignored Invite Requests" +msgstr "已忽略的邀請請求" + +#: bookwyrm/templates/settings/manage_invite_requests.html:35 +msgid "Date requested" +msgstr "請求日期" + +#: bookwyrm/templates/settings/manage_invite_requests.html:39 +msgid "Date accepted" +msgstr "接受日期" + +#: bookwyrm/templates/settings/manage_invite_requests.html:42 +msgid "Email" +msgstr "郵箱" + +#: bookwyrm/templates/settings/manage_invite_requests.html:47 +msgid "Action" +msgstr "動作" + +#: bookwyrm/templates/settings/manage_invite_requests.html:50 +msgid "No requests" +msgstr "沒有請求" + +#: bookwyrm/templates/settings/manage_invite_requests.html:59 +#: bookwyrm/templates/settings/status_filter.html:16 +msgid "Accepted" +msgstr "已接受" + +#: bookwyrm/templates/settings/manage_invite_requests.html:61 +#: bookwyrm/templates/settings/status_filter.html:12 +msgid "Sent" +msgstr "已傳送" + +#: bookwyrm/templates/settings/manage_invite_requests.html:63 +#: bookwyrm/templates/settings/status_filter.html:8 +msgid "Requested" +msgstr "已請求" + +#: bookwyrm/templates/settings/manage_invite_requests.html:73 +msgid "Send invite" +msgstr "傳送請求" + +#: bookwyrm/templates/settings/manage_invite_requests.html:75 +msgid "Re-send invite" +msgstr "重新發送請求" + +#: bookwyrm/templates/settings/manage_invite_requests.html:95 +msgid "Ignore" +msgstr "忽略" + +#: bookwyrm/templates/settings/manage_invite_requests.html:97 +msgid "Un-ignore" +msgstr "取消忽略" + +#: bookwyrm/templates/settings/manage_invite_requests.html:108 +msgid "Back to pending requests" +msgstr "回到待處理的請求" + +#: bookwyrm/templates/settings/manage_invite_requests.html:110 +msgid "View ignored requests" +msgstr "檢視忽略的請求" + +#: bookwyrm/templates/settings/manage_invites.html:21 +msgid "Generate New Invite" +msgstr "生成新的邀請" + +#: bookwyrm/templates/settings/manage_invites.html:27 +msgid "Expiry:" +msgstr "過期:" + +#: bookwyrm/templates/settings/manage_invites.html:33 +msgid "Use limit:" +msgstr "使用限制:" + +#: bookwyrm/templates/settings/manage_invites.html:40 +msgid "Create Invite" +msgstr "創建邀請" + +#: bookwyrm/templates/settings/manage_invites.html:47 +msgid "Link" +msgstr "連結" + +#: bookwyrm/templates/settings/manage_invites.html:48 +msgid "Expires" +msgstr "過期" + +#: bookwyrm/templates/settings/manage_invites.html:49 +msgid "Max uses" +msgstr "最大使用次數" + +#: bookwyrm/templates/settings/manage_invites.html:50 +msgid "Times used" +msgstr "已使用次數" + +#: bookwyrm/templates/settings/manage_invites.html:53 +msgid "No active invites" +msgstr "無有效的邀請" + +#: bookwyrm/templates/settings/server_blocklist.html:6 +msgid "Import Blocklist" +msgstr "匯入封鎖列表" + +#: bookwyrm/templates/settings/server_blocklist.html:26 +#: bookwyrm/templates/snippets/goal_progress.html:7 +msgid "Success!" +msgstr "成功!" + +#: bookwyrm/templates/settings/server_blocklist.html:30 +msgid "Successfully blocked:" +msgstr "成功封鎖了" + +#: bookwyrm/templates/settings/server_blocklist.html:32 +msgid "Failed:" +msgstr "已失敗:" + +#: bookwyrm/templates/settings/site.html:15 +msgid "Instance Name:" +msgstr "實例名稱" + +#: bookwyrm/templates/settings/site.html:19 +msgid "Tagline:" +msgstr "標語" + +#: bookwyrm/templates/settings/site.html:23 +msgid "Instance description:" +msgstr "實例描述:" + +#: bookwyrm/templates/settings/site.html:27 +msgid "Code of conduct:" +msgstr "行為準則:" + +#: bookwyrm/templates/settings/site.html:31 +msgid "Privacy Policy:" +msgstr "隱私政策:" + +#: bookwyrm/templates/settings/site.html:42 +msgid "Logo:" +msgstr "圖示:" + +#: bookwyrm/templates/settings/site.html:46 +msgid "Logo small:" +msgstr "小號圖示:" + +#: bookwyrm/templates/settings/site.html:50 +msgid "Favicon:" +msgstr "Favicon:" + +#: bookwyrm/templates/settings/site.html:61 +msgid "Support link:" +msgstr "支援連結:" + +#: bookwyrm/templates/settings/site.html:65 +msgid "Support title:" +msgstr "支援標題:" + +#: bookwyrm/templates/settings/site.html:69 +msgid "Admin email:" +msgstr "管理員郵件:" + +#: bookwyrm/templates/settings/site.html:73 +msgid "Additional info:" +msgstr "附加資訊:" + +#: bookwyrm/templates/settings/site.html:83 +msgid "Allow registration:" +msgstr "允許註冊:" + +#: bookwyrm/templates/settings/site.html:87 +msgid "Allow invite requests:" +msgstr "允許請求邀請:" + +#: bookwyrm/templates/settings/site.html:91 +msgid "Registration closed text:" +msgstr "註冊關閉文字:" + +#: bookwyrm/templates/snippets/announcement.html:31 +#, python-format +msgid "Posted by %(username)s" +msgstr "由 %(username)s 釋出" + +#: bookwyrm/templates/snippets/book_cover.html:31 +msgid "No cover" +msgstr "沒有封面" + +#: bookwyrm/templates/snippets/book_titleby.html:4 +#, python-format +msgid "%(title)s by " +msgstr "%(title)s 來自" + +#: bookwyrm/templates/snippets/boost_button.html:20 +#: bookwyrm/templates/snippets/boost_button.html:21 +msgid "Boost" +msgstr "轉發" + +#: bookwyrm/templates/snippets/boost_button.html:33 +#: bookwyrm/templates/snippets/boost_button.html:34 +msgid "Un-boost" +msgstr "取消轉發" + +#: bookwyrm/templates/snippets/content_warning_field.html:3 +msgid "Spoiler alert:" +msgstr "劇透警告:" + +#: bookwyrm/templates/snippets/content_warning_field.html:10 +msgid "Spoilers ahead!" +msgstr "前有劇透!" + +#: bookwyrm/templates/snippets/create_status.html:17 +msgid "Review" +msgstr "書評" + +#: bookwyrm/templates/snippets/create_status.html:39 +msgid "Quote" +msgstr "引用" + +#: bookwyrm/templates/snippets/create_status_form.html:23 +msgid "Comment:" +msgstr "評論:" + +#: bookwyrm/templates/snippets/create_status_form.html:25 +msgid "Quote:" +msgstr "引用:" + +#: bookwyrm/templates/snippets/create_status_form.html:27 +msgid "Review:" +msgstr "書評:" + +#: bookwyrm/templates/snippets/create_status_form.html:56 +#: bookwyrm/templates/snippets/status/layout.html:29 +#: bookwyrm/templates/snippets/status/layout.html:47 +#: bookwyrm/templates/snippets/status/layout.html:48 +msgid "Reply" +msgstr "回覆" + +#: bookwyrm/templates/snippets/create_status_form.html:56 +msgid "Content" +msgstr "內容" + +#: bookwyrm/templates/snippets/create_status_form.html:80 +#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:16 +msgid "Progress:" +msgstr "進度:" + +#: bookwyrm/templates/snippets/create_status_form.html:88 +#: bookwyrm/templates/snippets/readthrough_form.html:22 +#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:30 +msgid "pages" +msgstr "頁數" + +#: bookwyrm/templates/snippets/create_status_form.html:89 +#: bookwyrm/templates/snippets/readthrough_form.html:23 +#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:31 +msgid "percent" +msgstr "百分比" + +#: bookwyrm/templates/snippets/create_status_form.html:95 +#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:36 +#, python-format +msgid "of %(pages)s pages" +msgstr "全書 %(pages)s 頁" + +#: bookwyrm/templates/snippets/create_status_form.html:110 +msgid "Include spoiler alert" +msgstr "加入劇透警告" + +#: bookwyrm/templates/snippets/create_status_form.html:117 +#: bookwyrm/templates/snippets/privacy-icons.html:15 +#: bookwyrm/templates/snippets/privacy-icons.html:16 +#: bookwyrm/templates/snippets/privacy_select.html:19 +msgid "Private" +msgstr "私密" + +#: bookwyrm/templates/snippets/create_status_form.html:128 +msgid "Post" +msgstr "釋出" + +#: bookwyrm/templates/snippets/delete_readthrough_modal.html:4 +msgid "Delete these read dates?" +msgstr "刪除這些閱讀日期嗎?" + +#: bookwyrm/templates/snippets/delete_readthrough_modal.html:7 +#, python-format +msgid "You are deleting this readthrough and its %(count)s associated progress updates." +msgstr "你正要刪除這篇閱讀經過以及與之相關的 %(count)s 次進度更新。" + +#: bookwyrm/templates/snippets/fav_button.html:10 +#: bookwyrm/templates/snippets/fav_button.html:12 +msgid "Like" +msgstr "喜歡" + +#: bookwyrm/templates/snippets/fav_button.html:18 +#: bookwyrm/templates/snippets/fav_button.html:19 +msgid "Un-like" +msgstr "取消喜歡" + +#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:7 +msgid "Show filters" +msgstr "顯示過濾器" + +#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:9 +msgid "Hide filters" +msgstr "隱藏過濾器" + +#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:22 +msgid "Apply filters" +msgstr "使用過濾器" + +#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:26 +msgid "Clear filters" +msgstr "清除過濾器" + +#: bookwyrm/templates/snippets/follow_button.html:12 +msgid "Follow" +msgstr "關注" + +#: bookwyrm/templates/snippets/follow_button.html:18 +msgid "Undo follow request" +msgstr "撤回關注請求" + +#: bookwyrm/templates/snippets/follow_button.html:20 +msgid "Unfollow" +msgstr "取消關注" + +#: bookwyrm/templates/snippets/follow_request_buttons.html:7 +msgid "Accept" +msgstr "接受" + +#: bookwyrm/templates/snippets/form_rate_stars.html:19 +#: bookwyrm/templates/snippets/stars.html:13 +msgid "No rating" +msgstr "沒有評價" + +#: bookwyrm/templates/snippets/form_rate_stars.html:44 +#: bookwyrm/templates/snippets/stars.html:7 +#, python-format +msgid "%(rating)s star" +msgid_plural "%(rating)s stars" +msgstr[0] "%(rating)s 星" + +#: bookwyrm/templates/snippets/generated_status/goal.html:1 +#, python-format +msgid "set a goal to read %(counter)s book in %(year)s" +msgid_plural "set a goal to read %(counter)s books in %(year)s" +msgstr[0] "設定了在 %(year)s 內要讀 %(counter)s 本書的目標" + +#: bookwyrm/templates/snippets/generated_status/rating.html:3 +#, python-format +msgid "Rated %(title)s: %(display_rating)s star" +msgid_plural "Rated %(title)s: %(display_rating)s stars" +msgstr[0] "為 %(title)s 打了分: %(display_rating)s 星" + +#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4 +#, python-format +msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s" +msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s" +msgstr[0] "\"%(book_title)s\" 的書評(%(display_rating)s 星): %(review_title)s" + +#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:8 +#, python-format +msgid "Review of \"%(book_title)s\": %(review_title)s" +msgstr "\"%(book_title)s\" 的書評: %(review_title)s" + +#: bookwyrm/templates/snippets/goal_card.html:23 +#, python-format +msgid "You can set or change your reading goal any time from your profile page" +msgstr "你可以在任何時候從你的使用者資料頁面 中設定或改變你的閱讀目標" + +#: bookwyrm/templates/snippets/goal_form.html:9 +msgid "Reading goal:" +msgstr "閱讀目標:" + +#: bookwyrm/templates/snippets/goal_form.html:14 +msgid "books" +msgstr "本書" + +#: bookwyrm/templates/snippets/goal_form.html:19 +msgid "Goal privacy:" +msgstr "目標隱私:" + +#: bookwyrm/templates/snippets/goal_form.html:26 +#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:37 +#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:29 +#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:20 +msgid "Post to feed" +msgstr "發佈到即時動態" + +#: bookwyrm/templates/snippets/goal_form.html:30 +msgid "Set goal" +msgstr "設定目標" + +#: bookwyrm/templates/snippets/goal_progress.html:9 +#, python-format +msgid "%(percent)s%% complete!" +msgstr "完成了 %(percent)s%% !" + +#: bookwyrm/templates/snippets/goal_progress.html:12 +#, python-format +msgid "You've read %(read_count)s of %(goal_count)s books." +msgstr "你已經閱讀了 %(goal_count)s 本書中的 %(read_count)s 本。" + +#: bookwyrm/templates/snippets/goal_progress.html:14 +#, python-format +msgid "%(username)s has read %(read_count)s of %(goal_count)s books." +msgstr "%(username)s 已經閱讀了 %(goal_count)s 本書中的 %(read_count)s 本。" + +#: bookwyrm/templates/snippets/page_text.html:4 +#, python-format +msgid "page %(page)s of %(total_pages)s" +msgstr "%(total_pages)s 頁中的第 %(page)s 頁" + +#: bookwyrm/templates/snippets/page_text.html:6 +#, python-format +msgid "page %(page)s" +msgstr "第 %(page)s 頁" + +#: bookwyrm/templates/snippets/pagination.html:12 +msgid "Previous" +msgstr "往前" + +#: bookwyrm/templates/snippets/pagination.html:23 +msgid "Next" +msgstr "往後" + +#: bookwyrm/templates/snippets/privacy-icons.html:3 +#: bookwyrm/templates/snippets/privacy-icons.html:4 +#: bookwyrm/templates/snippets/privacy_select.html:10 +msgid "Public" +msgstr "公開" + +#: bookwyrm/templates/snippets/privacy-icons.html:7 +#: bookwyrm/templates/snippets/privacy-icons.html:8 +#: bookwyrm/templates/snippets/privacy_select.html:13 +msgid "Unlisted" +msgstr "不公開" + +#: bookwyrm/templates/snippets/privacy-icons.html:12 +msgid "Followers-only" +msgstr "僅關注者" + +#: bookwyrm/templates/snippets/privacy_select.html:6 +msgid "Post privacy" +msgstr "發文隱私" + +#: bookwyrm/templates/snippets/privacy_select.html:16 +#: bookwyrm/templates/user/relationships/followers.html:6 +#: bookwyrm/templates/user/relationships/layout.html:11 +msgid "Followers" +msgstr "關注者" + +#: bookwyrm/templates/snippets/rate_action.html:4 +msgid "Leave a rating" +msgstr "留下評價" + +#: bookwyrm/templates/snippets/rate_action.html:19 +msgid "Rate" +msgstr "評價" + +#: bookwyrm/templates/snippets/readthrough.html:8 +msgid "Progress Updates:" +msgstr "進度更新:" + +#: bookwyrm/templates/snippets/readthrough.html:14 +msgid "finished" +msgstr "已完成" + +#: bookwyrm/templates/snippets/readthrough.html:25 +msgid "Show all updates" +msgstr "顯示所有更新" + +#: bookwyrm/templates/snippets/readthrough.html:41 +msgid "Delete this progress update" +msgstr "刪除此進度更新" + +#: bookwyrm/templates/snippets/readthrough.html:52 +msgid "started" +msgstr "已開始" + +#: bookwyrm/templates/snippets/readthrough.html:59 +#: bookwyrm/templates/snippets/readthrough.html:73 +msgid "Edit read dates" +msgstr "編輯閱讀日期" + +#: bookwyrm/templates/snippets/readthrough.html:63 +msgid "Delete these read dates" +msgstr "刪除這些閱讀日期" + +#: bookwyrm/templates/snippets/readthrough_form.html:7 +#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:19 +#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:17 +msgid "Started reading" +msgstr "已開始閱讀" + +#: bookwyrm/templates/snippets/readthrough_form.html:14 +msgid "Progress" +msgstr "進度" + +#: bookwyrm/templates/snippets/readthrough_form.html:30 +#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:25 +msgid "Finished reading" +msgstr "已完成閱讀" + +#: bookwyrm/templates/snippets/register_form.html:32 +msgid "Sign Up" +msgstr "註冊" + +#: bookwyrm/templates/snippets/report_button.html:6 +msgid "Report" +msgstr "舉報" + +#: bookwyrm/templates/snippets/search_result_text.html:36 +msgid "Import book" +msgstr "匯入書目" + +#: bookwyrm/templates/snippets/shelf_selector.html:4 +msgid "Move book" +msgstr "移動書目" + +#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:5 +#, python-format +msgid "Finish \"%(book_title)s\"" +msgstr "完成 \"%(book_title)s\"" + +#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:36 +msgid "Update progress" +msgstr "更新進度" + +#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown.html:5 +msgid "More shelves" +msgstr "更多書架" + +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:10 +msgid "Start reading" +msgstr "開始閱讀" + +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:15 +msgid "Finish reading" +msgstr "完成閱讀" + +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:18 +#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:26 +msgid "Want to read" +msgstr "想要閱讀" + +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:47 +#, python-format +msgid "Remove from %(name)s" +msgstr "從 %(name)s 移除" + +#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:5 +#, python-format +msgid "Start \"%(book_title)s\"" +msgstr "開始 \"%(book_title)s\"" + +#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:5 +#, python-format +msgid "Want to Read \"%(book_title)s\"" +msgstr "想要閱讀 \"%(book_title)s\"" + +#: bookwyrm/templates/snippets/status/content_status.html:71 +#: bookwyrm/templates/snippets/trimmed_text.html:15 +msgid "Show more" +msgstr "顯示更多" + +#: bookwyrm/templates/snippets/status/content_status.html:86 +#: bookwyrm/templates/snippets/trimmed_text.html:30 +msgid "Show less" +msgstr "顯示更少" + +#: bookwyrm/templates/snippets/status/content_status.html:116 +msgid "Open image in new window" +msgstr "在新視窗中開啟圖片" + +#: bookwyrm/templates/snippets/status/layout.html:21 +#: bookwyrm/templates/snippets/status/status_options.html:17 +msgid "Delete status" +msgstr "刪除狀態" + +#: bookwyrm/templates/snippets/status/layout.html:51 +#: bookwyrm/templates/snippets/status/layout.html:52 +msgid "Boost status" +msgstr "轉發狀態" + +#: bookwyrm/templates/snippets/status/layout.html:55 +#: bookwyrm/templates/snippets/status/layout.html:56 +msgid "Like status" +msgstr "喜歡狀態" + +#: bookwyrm/templates/snippets/status/status.html:10 +msgid "boosted" +msgstr "轉發了" + +#: bookwyrm/templates/snippets/status/status_header.html:45 +#, python-format +msgid "replied to %(username)s's status" +msgstr "回覆了 %(username)s狀態" + +#: bookwyrm/templates/snippets/status/status_options.html:7 +#: bookwyrm/templates/snippets/user_options.html:7 +msgid "More options" +msgstr "更多選項" + +#: bookwyrm/templates/snippets/status/status_options.html:26 +msgid "Delete & re-draft" +msgstr "刪除並重新起草" + +#: bookwyrm/templates/snippets/status/status_options.html:35 +#: bookwyrm/templates/snippets/user_options.html:13 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:6 +msgid "Send direct message" +msgstr "發送私信" + +#: bookwyrm/templates/snippets/switch_edition_button.html:5 +msgid "Switch to this edition" +msgstr "切換到此版本" + +#: bookwyrm/templates/snippets/table-sort-header.html:6 +msgid "Sorted ascending" +msgstr "升序排序" + +#: bookwyrm/templates/snippets/table-sort-header.html:10 +msgid "Sorted descending" +msgstr "降序排序" + +#: bookwyrm/templates/user/layout.html:13 bookwyrm/templates/user/user.html:10 +msgid "User Profile" +msgstr "使用者使用者資料" + +#: bookwyrm/templates/user/layout.html:37 +msgid "Follow Requests" +msgstr "關注請求" + +#: bookwyrm/templates/user/layout.html:62 +msgid "Reading Goal" +msgstr "閱讀目標" + +#: bookwyrm/templates/user/lists.html:11 +#, python-format +msgid "Lists: %(username)s" +msgstr "列表: %(username)s" + +#: bookwyrm/templates/user/lists.html:17 bookwyrm/templates/user/lists.html:29 +msgid "Create list" +msgstr "建立列表" + +#: bookwyrm/templates/user/relationships/followers.html:12 +#, python-format +msgid "%(username)s has no followers" +msgstr "%(username)s 沒有關注者" + +#: bookwyrm/templates/user/relationships/following.html:6 +#: bookwyrm/templates/user/relationships/layout.html:15 +msgid "Following" +msgstr "正在關注" + +#: bookwyrm/templates/user/relationships/following.html:12 +#, python-format +msgid "%(username)s isn't following any users" +msgstr "%(username)s 沒有關注任何使用者" + +#: bookwyrm/templates/user/shelf/books_header.html:5 +#, python-format +msgid "%(username)s's books" +msgstr "%(username)s 的書目" + +#: bookwyrm/templates/user/shelf/create_shelf_form.html:5 +#: bookwyrm/templates/user/shelf/create_shelf_form.html:22 +msgid "Create Shelf" +msgstr "建立書架" + +#: bookwyrm/templates/user/shelf/edit_shelf_form.html:5 +msgid "Edit Shelf" +msgstr "編輯書架" + +#: bookwyrm/templates/user/shelf/edit_shelf_form.html:26 +msgid "Update shelf" +msgstr "更新書架" + +#: bookwyrm/templates/user/shelf/shelf.html:25 bookwyrm/views/shelf.py:56 +msgid "All books" +msgstr "所有書目" + +#: bookwyrm/templates/user/shelf/shelf.html:38 +msgid "Create shelf" +msgstr "建立書架" + +#: bookwyrm/templates/user/shelf/shelf.html:62 +msgid "Edit shelf" +msgstr "編輯書架" + +#: bookwyrm/templates/user/shelf/shelf.html:81 +#: bookwyrm/templates/user/shelf/shelf.html:105 +msgid "Shelved" +msgstr "上架時間" + +#: bookwyrm/templates/user/shelf/shelf.html:82 +#: bookwyrm/templates/user/shelf/shelf.html:109 +msgid "Started" +msgstr "開始時間" + +#: bookwyrm/templates/user/shelf/shelf.html:83 +#: bookwyrm/templates/user/shelf/shelf.html:112 +msgid "Finished" +msgstr "完成時間" + +#: bookwyrm/templates/user/shelf/shelf.html:138 +msgid "This shelf is empty." +msgstr "此書架是空的。" + +#: bookwyrm/templates/user/shelf/shelf.html:144 +msgid "Delete shelf" +msgstr "刪除書架" + +#: bookwyrm/templates/user/user.html:16 +msgid "Edit profile" +msgstr "編輯使用者資料" + +#: bookwyrm/templates/user/user.html:33 +#, python-format +msgid "View all %(size)s" +msgstr "檢視所有 %(size)s 本" + +#: bookwyrm/templates/user/user.html:46 +msgid "View all books" +msgstr "檢視所有書目" + +#: bookwyrm/templates/user/user.html:59 +msgid "User Activity" +msgstr "使用者活動" + +#: bookwyrm/templates/user/user.html:63 +msgid "RSS feed" +msgstr "RSS 訂閱" + +#: bookwyrm/templates/user/user.html:74 +msgid "No activities yet!" +msgstr "還沒有活動!" + +#: bookwyrm/templates/user/user_preview.html:15 +#, python-format +msgid "Joined %(date)s" +msgstr "在 %(date)s 加入" + +#: bookwyrm/templates/user/user_preview.html:19 +#, python-format +msgid "%(counter)s follower" +msgid_plural "%(counter)s followers" +msgstr[0] "%(counter)s 個關注者" + +#: bookwyrm/templates/user/user_preview.html:20 +#, python-format +msgid "%(counter)s following" +msgstr "關注著 %(counter)s 人" + +#: bookwyrm/templates/user/user_preview.html:26 +#, python-format +msgid "%(mutuals_display)s follower you follow" +msgid_plural "%(mutuals_display)s followers you follow" +msgstr[0] "%(mutuals_display)s 個你也關注的關注者" + +#: bookwyrm/templates/user_admin/user.html:9 +msgid "Back to users" +msgstr "回到使用者" + +#: bookwyrm/templates/user_admin/user_admin.html:7 +#, python-format +msgid "Users: %(instance_name)s" +msgstr "使用者: %(instance_name)s" + +#: bookwyrm/templates/user_admin/user_admin.html:22 +#: bookwyrm/templates/user_admin/username_filter.html:5 +msgid "Username" +msgstr "使用者名稱" + +#: bookwyrm/templates/user_admin/user_admin.html:26 +msgid "Date Added" +msgstr "新增日期:" + +#: bookwyrm/templates/user_admin/user_admin.html:30 +msgid "Last Active" +msgstr "最後活躍" + +#: bookwyrm/templates/user_admin/user_admin.html:38 +msgid "Remote instance" +msgstr "移除伺服器" + +#: bookwyrm/templates/user_admin/user_admin.html:47 +msgid "Active" +msgstr "活躍" + +#: bookwyrm/templates/user_admin/user_admin.html:47 +msgid "Inactive" +msgstr "停用" + +#: bookwyrm/templates/user_admin/user_admin.html:52 +#: bookwyrm/templates/user_admin/user_info.html:49 +msgid "Not set" +msgstr "未設定" + +#: bookwyrm/templates/user_admin/user_info.html:5 +msgid "User details" +msgstr "使用者詳情" + +#: bookwyrm/templates/user_admin/user_info.html:14 +msgid "View user profile" +msgstr "檢視使用者資料" + +#: bookwyrm/templates/user_admin/user_info.html:20 +msgid "Instance details" +msgstr "實例詳情" + +#: bookwyrm/templates/user_admin/user_info.html:46 +msgid "View instance" +msgstr "檢視實例" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:11 +msgid "Suspend user" +msgstr "停用使用者" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:13 +msgid "Un-suspend user" +msgstr "取消停用使用者" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:21 +msgid "Access level:" +msgstr "訪問權限:" + +#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:3 +msgid "File exceeds maximum size: 10MB" +msgstr "檔案超過了最大大小: 10MB" + +#: bookwyrm/views/import_data.py:67 +msgid "Not a valid csv file" +msgstr "不是有效的 csv 檔案" + +#: bookwyrm/views/password.py:32 +msgid "No user with that email address was found." +msgstr "沒有找到使用該郵箱的使用者。" + +#: bookwyrm/views/password.py:41 +#, python-format +msgid "A password reset link sent to %s" +msgstr "密碼重置連結已傳送給 %s" + From 28a76662fec8168998668c3c6f378b5dee50808a Mon Sep 17 00:00:00 2001 From: Joel Bradshaw Date: Fri, 2 Jul 2021 23:53:42 -0700 Subject: [PATCH 06/14] Add backend parameter to Celery initializer This fixed an error when viewing imports for my setup --- bookwyrm/tasks.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bookwyrm/tasks.py b/bookwyrm/tasks.py index 23765f09..3a4d14a2 100644 --- a/bookwyrm/tasks.py +++ b/bookwyrm/tasks.py @@ -9,4 +9,5 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "celerywyrm.settings") app = Celery( "tasks", broker=settings.CELERY_BROKER, + backend=settings.CELERY_RESULT_BACKEND ) From ecff6dd051206938caaabf842b17d350747ab0b9 Mon Sep 17 00:00:00 2001 From: Joel Bradshaw Date: Sat, 3 Jul 2021 00:22:55 -0700 Subject: [PATCH 07/14] Make it black --- bookwyrm/tasks.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/bookwyrm/tasks.py b/bookwyrm/tasks.py index 3a4d14a2..6d1992a7 100644 --- a/bookwyrm/tasks.py +++ b/bookwyrm/tasks.py @@ -7,7 +7,5 @@ from bookwyrm import settings # set the default Django settings module for the 'celery' program. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "celerywyrm.settings") app = Celery( - "tasks", - broker=settings.CELERY_BROKER, - backend=settings.CELERY_RESULT_BACKEND + "tasks", broker=settings.CELERY_BROKER, backend=settings.CELERY_RESULT_BACKEND ) From b4c6587972d96f7d0c1d299a5ac1ed317d1c987e Mon Sep 17 00:00:00 2001 From: Joel Bradshaw Date: Mon, 5 Jul 2021 13:14:35 -0700 Subject: [PATCH 08/14] Fix bw-dev resetdb, some tweaks to bw-dev The main fix here is for resetdb, it previously was failing to drop the db for me, because `web` was up and running and using the database. This commit spins up db by itself first so it can drop and re-create the database successfully, then brings up web to run the migrations. While I was in here, I also updated it so that when running `bw-dev` without any command it will also print the helptext, rather than just exiting silently, got rid of the double-echo of the helptext, and added runweb/rundb commands to run arbitrary commands via bw-dev. --- bw-dev | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/bw-dev b/bw-dev index 958ec933..541498b4 100755 --- a/bw-dev +++ b/bw-dev @@ -39,7 +39,9 @@ function makeitblack { } CMD=$1 -shift +if [ -n "$CMD" ]; then + shift +fi # show commands as they're executed set -x @@ -56,9 +58,12 @@ case "$CMD" in ;; resetdb) clean - docker-compose up --build -d + # Start just the DB so no one else is using it + docker-compose up --build -d db execdb dropdb -U ${POSTGRES_USER} ${POSTGRES_DB} execdb createdb -U ${POSTGRES_USER} ${POSTGRES_DB} + # Now start up web so we can run the migrations + docker-compose up --build -d web initdb clean ;; @@ -110,7 +115,14 @@ case "$CMD" in generate_preview_images) runweb python manage.py generate_preview_images $@ ;; + runweb) + runweb "$@" + ;; + rundb) + rundb "$@" + ;; *) + set +x # No need to echo echo echo "Unrecognised command. Try: build, clean, up, initdb, resetdb, makemigrations, migrate, bash, shell, dbshell, restart_celery, test, pytest, test_report, black, populate_streams, generate_preview_images" ;; esac From fede777e9bf31d3ae93b2c9c38dc2e914dac5359 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 7 Jul 2021 09:37:21 -0700 Subject: [PATCH 09/14] Hide deleted status counts from book page --- bookwyrm/templates/book/book.html | 8 ++++---- bookwyrm/views/books.py | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/bookwyrm/templates/book/book.html b/bookwyrm/templates/book/book.html index 26bd8322..d721d4fd 100644 --- a/bookwyrm/templates/book/book.html +++ b/bookwyrm/templates/book/book.html @@ -209,24 +209,24 @@ diff --git a/bookwyrm/views/books.py b/bookwyrm/views/books.py index a4b9f312..492d0cac 100644 --- a/bookwyrm/views/books.py +++ b/bookwyrm/views/books.py @@ -59,7 +59,7 @@ class Book(View): queryset = book.comment_set else: queryset = book.quotation_set - queryset = queryset.filter(user=request.user) + queryset = queryset.filter(user=request.user, deleted=False) else: queryset = reviews.exclude(Q(content__isnull=True) | Q(content="")) queryset = queryset.select_related("user") @@ -102,10 +102,11 @@ class Book(View): book__parent_work=book.parent_work, ).select_related("shelf", "book") + filters = {"user": request.user, "deleted": False} data["user_statuses"] = { - "review_count": book.review_set.filter(user=request.user).count(), - "comment_count": book.comment_set.filter(user=request.user).count(), - "quotation_count": book.quotation_set.filter(user=request.user).count(), + "review_count": book.review_set.filter(**filters).count(), + "comment_count": book.comment_set.filter(**filters).count(), + "quotation_count": book.quotation_set.filter(**filters).count(), } return TemplateResponse(request, "book/book.html", data) From b3cd9483d33d7273bec8bde68d147906b9ab025a Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 7 Jul 2021 09:47:07 -0700 Subject: [PATCH 10/14] Adds test for misinterpreted links --- bookwyrm/tests/views/test_status.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/bookwyrm/tests/views/test_status.py b/bookwyrm/tests/views/test_status.py index 9253e6e5..68ddcd28 100644 --- a/bookwyrm/tests/views/test_status.py +++ b/bookwyrm/tests/views/test_status.py @@ -8,6 +8,7 @@ from bookwyrm import forms, models, views from bookwyrm.settings import DOMAIN +# pylint: disable=invalid-name @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") class StatusViews(TestCase): """viewing and creating statuses""" @@ -318,6 +319,15 @@ class StatusViews(TestCase): '

hi and fish.com ' "is rad

", ) + def test_to_markdown_detect_url(self, _): + """this is mostly handled in other places, but nonetheless""" + text = "http://fish.com/@hello#okay" + result = views.status.to_markdown(text) + self.assertEqual( + result, + '

fish.com/@hello#okay

', + ) + def test_to_markdown_link(self, _): """this is mostly handled in other places, but nonetheless""" text = "[hi](http://fish.com) is rad" From 23631c3c4fa4edf5f04cb9930828c15e48cfb0f2 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 7 Jul 2021 09:49:22 -0700 Subject: [PATCH 11/14] Fixes failing links --- bookwyrm/views/status.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/status.py b/bookwyrm/views/status.py index 61b6dc7a..651021b6 100644 --- a/bookwyrm/views/status.py +++ b/bookwyrm/views/status.py @@ -150,7 +150,7 @@ def find_mentions(content): def format_links(content): """detect and format links""" return re.sub( - r'([^(href=")]|^|\()(https?:\/\/(%s([\w\.\-_\/+&\?=:;,])*))' % regex.DOMAIN, + r'([^(href=")]|^|\()(https?:\/\/(%s([\w\.\-_\/+&\?=:;,@#])*))' % regex.DOMAIN, r'\g<1>\g<3>', content, ) From b41d9440fd68a96c17966f498eca1fb5cf5b2a2b Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 7 Jul 2021 10:24:23 -0700 Subject: [PATCH 12/14] Adds tests for ordered collection page generator --- .../tests/models/test_activitypub_mixin.py | 190 ++++++++++++------ 1 file changed, 124 insertions(+), 66 deletions(-) diff --git a/bookwyrm/tests/models/test_activitypub_mixin.py b/bookwyrm/tests/models/test_activitypub_mixin.py index 020d031d..553ca546 100644 --- a/bookwyrm/tests/models/test_activitypub_mixin.py +++ b/bookwyrm/tests/models/test_activitypub_mixin.py @@ -9,11 +9,19 @@ from django.test import TestCase from bookwyrm.activitypub.base_activity import ActivityObject from bookwyrm import models from bookwyrm.models import base_model -from bookwyrm.models.activitypub_mixin import ActivitypubMixin -from bookwyrm.models.activitypub_mixin import ActivityMixin, ObjectMixin +from bookwyrm.models.activitypub_mixin import ( + ActivitypubMixin, + ActivityMixin, + ObjectMixin, + OrderedCollectionMixin, + to_ordered_collection_page, +) +from bookwyrm.settings import PAGE_LENGTH +# pylint: disable=invalid-name @patch("bookwyrm.activitystreams.ActivityStream.add_status") +@patch("bookwyrm.preview_images.generate_user_preview_image_task.delay") class ActivitypubMixins(TestCase): """functionality shared across models""" @@ -45,8 +53,7 @@ class ActivitypubMixins(TestCase): "published": "2020-12-04T17:52:22.623807+00:00", } - # ActivitypubMixin - def test_to_activity(self, _): + def test_to_activity(self, *_): """model to ActivityPub json""" @dataclass(init=False) @@ -67,7 +74,7 @@ class ActivitypubMixins(TestCase): self.assertEqual(activity["id"], "https://www.example.com/test") self.assertEqual(activity["type"], "Test") - def test_find_existing_by_remote_id(self, _): + def test_find_existing_by_remote_id(self, *_): """attempt to match a remote id to an object in the db""" # uses a different remote id scheme # this isn't really part of this test directly but it's helpful to state @@ -101,7 +108,7 @@ class ActivitypubMixins(TestCase): # test subclass match result = models.Status.find_existing_by_remote_id("https://comment.net") - def test_find_existing(self, _): + def test_find_existing(self, *_): """match a blob of data to a model""" with patch("bookwyrm.preview_images.generate_edition_preview_image_task.delay"): book = models.Edition.objects.create( @@ -112,7 +119,7 @@ class ActivitypubMixins(TestCase): result = models.Edition.find_existing({"openlibraryKey": "OL1234"}) self.assertEqual(result, book) - def test_get_recipients_public_object(self, _): + def test_get_recipients_public_object(self, *_): """determines the recipients for an object's broadcast""" MockSelf = namedtuple("Self", ("privacy")) mock_self = MockSelf("public") @@ -120,7 +127,7 @@ class ActivitypubMixins(TestCase): self.assertEqual(len(recipients), 1) self.assertEqual(recipients[0], self.remote_user.inbox) - def test_get_recipients_public_user_object_no_followers(self, _): + def test_get_recipients_public_user_object_no_followers(self, *_): """determines the recipients for a user's object broadcast""" MockSelf = namedtuple("Self", ("privacy", "user")) mock_self = MockSelf("public", self.local_user) @@ -128,7 +135,7 @@ class ActivitypubMixins(TestCase): recipients = ActivitypubMixin.get_recipients(mock_self) self.assertEqual(len(recipients), 0) - def test_get_recipients_public_user_object(self, _): + def test_get_recipients_public_user_object(self, *_): """determines the recipients for a user's object broadcast""" MockSelf = namedtuple("Self", ("privacy", "user")) mock_self = MockSelf("public", self.local_user) @@ -138,22 +145,21 @@ class ActivitypubMixins(TestCase): self.assertEqual(len(recipients), 1) self.assertEqual(recipients[0], self.remote_user.inbox) - def test_get_recipients_public_user_object_with_mention(self, _): + def test_get_recipients_public_user_object_with_mention(self, *_): """determines the recipients for a user's object broadcast""" MockSelf = namedtuple("Self", ("privacy", "user")) mock_self = MockSelf("public", self.local_user) self.local_user.followers.add(self.remote_user) - with patch("bookwyrm.preview_images.generate_user_preview_image_task.delay"): - with patch("bookwyrm.models.user.set_remote_server.delay"): - another_remote_user = models.User.objects.create_user( - "nutria", - "nutria@nutria.com", - "nutriaword", - local=False, - remote_id="https://example.com/users/nutria", - inbox="https://example.com/users/nutria/inbox", - outbox="https://example.com/users/nutria/outbox", - ) + with patch("bookwyrm.models.user.set_remote_server.delay"): + another_remote_user = models.User.objects.create_user( + "nutria", + "nutria@nutria.com", + "nutriaword", + local=False, + remote_id="https://example.com/users/nutria", + inbox="https://example.com/users/nutria/inbox", + outbox="https://example.com/users/nutria/outbox", + ) MockSelf = namedtuple("Self", ("privacy", "user", "recipients")) mock_self = MockSelf("public", self.local_user, [another_remote_user]) @@ -162,22 +168,21 @@ class ActivitypubMixins(TestCase): self.assertTrue(another_remote_user.inbox in recipients) self.assertTrue(self.remote_user.inbox in recipients) - def test_get_recipients_direct(self, _): + def test_get_recipients_direct(self, *_): """determines the recipients for a user's object broadcast""" MockSelf = namedtuple("Self", ("privacy", "user")) mock_self = MockSelf("public", self.local_user) self.local_user.followers.add(self.remote_user) - with patch("bookwyrm.preview_images.generate_user_preview_image_task.delay"): - with patch("bookwyrm.models.user.set_remote_server.delay"): - another_remote_user = models.User.objects.create_user( - "nutria", - "nutria@nutria.com", - "nutriaword", - local=False, - remote_id="https://example.com/users/nutria", - inbox="https://example.com/users/nutria/inbox", - outbox="https://example.com/users/nutria/outbox", - ) + with patch("bookwyrm.models.user.set_remote_server.delay"): + another_remote_user = models.User.objects.create_user( + "nutria", + "nutria@nutria.com", + "nutriaword", + local=False, + remote_id="https://example.com/users/nutria", + inbox="https://example.com/users/nutria/inbox", + outbox="https://example.com/users/nutria/outbox", + ) MockSelf = namedtuple("Self", ("privacy", "user", "recipients")) mock_self = MockSelf("direct", self.local_user, [another_remote_user]) @@ -185,22 +190,21 @@ class ActivitypubMixins(TestCase): self.assertEqual(len(recipients), 1) self.assertEqual(recipients[0], another_remote_user.inbox) - def test_get_recipients_combine_inboxes(self, _): + def test_get_recipients_combine_inboxes(self, *_): """should combine users with the same shared_inbox""" self.remote_user.shared_inbox = "http://example.com/inbox" self.remote_user.save(broadcast=False) - with patch("bookwyrm.preview_images.generate_user_preview_image_task.delay"): - with patch("bookwyrm.models.user.set_remote_server.delay"): - another_remote_user = models.User.objects.create_user( - "nutria", - "nutria@nutria.com", - "nutriaword", - local=False, - remote_id="https://example.com/users/nutria", - inbox="https://example.com/users/nutria/inbox", - shared_inbox="http://example.com/inbox", - outbox="https://example.com/users/nutria/outbox", - ) + with patch("bookwyrm.models.user.set_remote_server.delay"): + another_remote_user = models.User.objects.create_user( + "nutria", + "nutria@nutria.com", + "nutriaword", + local=False, + remote_id="https://example.com/users/nutria", + inbox="https://example.com/users/nutria/inbox", + shared_inbox="http://example.com/inbox", + outbox="https://example.com/users/nutria/outbox", + ) MockSelf = namedtuple("Self", ("privacy", "user")) mock_self = MockSelf("public", self.local_user) self.local_user.followers.add(self.remote_user) @@ -210,20 +214,19 @@ class ActivitypubMixins(TestCase): self.assertEqual(len(recipients), 1) self.assertEqual(recipients[0], "http://example.com/inbox") - def test_get_recipients_software(self, _): + def test_get_recipients_software(self, *_): """should differentiate between bookwyrm and other remote users""" - with patch("bookwyrm.preview_images.generate_user_preview_image_task.delay"): - with patch("bookwyrm.models.user.set_remote_server.delay"): - another_remote_user = models.User.objects.create_user( - "nutria", - "nutria@nutria.com", - "nutriaword", - local=False, - remote_id="https://example.com/users/nutria", - inbox="https://example.com/users/nutria/inbox", - outbox="https://example.com/users/nutria/outbox", - bookwyrm_user=False, - ) + with patch("bookwyrm.models.user.set_remote_server.delay"): + another_remote_user = models.User.objects.create_user( + "nutria", + "nutria@nutria.com", + "nutriaword", + local=False, + remote_id="https://example.com/users/nutria", + inbox="https://example.com/users/nutria/inbox", + outbox="https://example.com/users/nutria/outbox", + bookwyrm_user=False, + ) MockSelf = namedtuple("Self", ("privacy", "user")) mock_self = MockSelf("public", self.local_user) self.local_user.followers.add(self.remote_user) @@ -241,7 +244,7 @@ class ActivitypubMixins(TestCase): self.assertEqual(recipients[0], another_remote_user.inbox) # ObjectMixin - def test_object_save_create(self, _): + def test_object_save_create(self, *_): """should save uneventufully when broadcast is disabled""" class Success(Exception): @@ -272,7 +275,7 @@ class ActivitypubMixins(TestCase): ObjectModel(user=self.local_user).save(broadcast=False) ObjectModel(user=None).save() - def test_object_save_update(self, _): + def test_object_save_update(self, *_): """should save uneventufully when broadcast is disabled""" class Success(Exception): @@ -298,7 +301,7 @@ class ActivitypubMixins(TestCase): with self.assertRaises(Success): UpdateObjectModel(id=1, last_edited_by=self.local_user).save() - def test_object_save_delete(self, _): + def test_object_save_delete(self, *_): """should create delete activities when objects are deleted by flag""" class ActivitySuccess(Exception): @@ -320,7 +323,7 @@ class ActivitypubMixins(TestCase): with self.assertRaises(ActivitySuccess): DeletableObjectModel(id=1, user=self.local_user, deleted=True).save() - def test_to_delete_activity(self, _): + def test_to_delete_activity(self, *_): """wrapper for Delete activity""" MockSelf = namedtuple("Self", ("remote_id", "to_activity")) mock_self = MockSelf( @@ -335,7 +338,7 @@ class ActivitypubMixins(TestCase): activity["cc"], ["https://www.w3.org/ns/activitystreams#Public"] ) - def test_to_update_activity(self, _): + def test_to_update_activity(self, *_): """ditto above but for Update""" MockSelf = namedtuple("Self", ("remote_id", "to_activity")) mock_self = MockSelf( @@ -352,8 +355,7 @@ class ActivitypubMixins(TestCase): ) self.assertIsInstance(activity["object"], dict) - # Activity mixin - def test_to_undo_activity(self, _): + def test_to_undo_activity(self, *_): """and again, for Undo""" MockSelf = namedtuple("Self", ("remote_id", "to_activity", "user")) mock_self = MockSelf( @@ -366,3 +368,59 @@ class ActivitypubMixins(TestCase): self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["type"], "Undo") self.assertIsInstance(activity["object"], dict) + + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") + def test_to_ordered_collection_page(self, *_): + """make sure the paged results of an ordered collection work""" + self.assertEqual(PAGE_LENGTH, 15) + for number in range(0, 2 * PAGE_LENGTH): + models.Status.objects.create( + user=self.local_user, + content="test status {:d}".format(number), + ) + page_1 = to_ordered_collection_page( + models.Status.objects.all(), "http://fish.com/", page=1 + ) + self.assertEqual(page_1.partOf, "http://fish.com/") + self.assertEqual(page_1.id, "http://fish.com/?page=1") + self.assertEqual(page_1.next, "http://fish.com/?page=2") + self.assertEqual(page_1.orderedItems[0]["content"], "test status 29") + self.assertEqual(page_1.orderedItems[1]["content"], "test status 28") + + page_2 = to_ordered_collection_page( + models.Status.objects.all(), "http://fish.com/", page=2 + ) + self.assertEqual(page_2.partOf, "http://fish.com/") + self.assertEqual(page_2.id, "http://fish.com/?page=2") + self.assertEqual(page_2.orderedItems[0]["content"], "test status 14") + self.assertEqual(page_2.orderedItems[-1]["content"], "test status 0") + + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") + def test_to_ordered_collection(self, *_): + """convert a queryset into an ordered collection object""" + self.assertEqual(PAGE_LENGTH, 15) + + for number in range(0, 2 * PAGE_LENGTH): + models.Status.objects.create( + user=self.local_user, + content="test status {:d}".format(number), + ) + + MockSelf = namedtuple("Self", ("remote_id")) + mock_self = MockSelf("") + + collection = OrderedCollectionMixin.to_ordered_collection( + mock_self, models.Status.objects.all(), remote_id="http://fish.com/" + ) + + self.assertEqual(collection.totalItems, 30) + self.assertEqual(collection.first, "http://fish.com/?page=1") + self.assertEqual(collection.last, "http://fish.com/?page=2") + + page_2 = OrderedCollectionMixin.to_ordered_collection( + mock_self, models.Status.objects.all(), remote_id="http://fish.com/", page=2 + ) + self.assertEqual(page_2.partOf, "http://fish.com/") + self.assertEqual(page_2.id, "http://fish.com/?page=2") + self.assertEqual(page_2.orderedItems[0]["content"], "test status 14") + self.assertEqual(page_2.orderedItems[-1]["content"], "test status 0") From 88c23117ffd725ce2eb48519df885748e9f6902a Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 7 Jul 2021 10:56:19 -0700 Subject: [PATCH 13/14] Fixes outbox pagination --- bookwyrm/models/activitypub_mixin.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 83b4c0ab..729d9cba 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -30,6 +30,7 @@ logger = logging.getLogger(__name__) PropertyField = namedtuple("PropertyField", ("set_activity_from_field")) +# pylint: disable=invalid-name def set_activity_from_property_field(activity, obj, field): """assign a model property value to the activity json""" activity[field[1]] = getattr(obj, field[0]) @@ -318,7 +319,9 @@ class OrderedCollectionPageMixin(ObjectMixin): remote_id = remote_id or self.remote_id if page: - return to_ordered_collection_page(queryset, remote_id, **kwargs) + if isinstance(page, list) and len(page) > 0: + page = page[0] + return to_ordered_collection_page(queryset, remote_id, page=page, **kwargs) if collection_only or not hasattr(self, "activity_serializer"): serializer = activitypub.OrderedCollection From 3f15e4410ed2e43684f1578ed8db63428afeca4c Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 12 Jul 2021 16:17:20 -0700 Subject: [PATCH 14/14] Fixes link to edit book --- bookwyrm/templates/book/book.html | 2 +- bookwyrm/urls.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/templates/book/book.html b/bookwyrm/templates/book/book.html index d721d4fd..9a75cbe9 100644 --- a/bookwyrm/templates/book/book.html +++ b/bookwyrm/templates/book/book.html @@ -47,7 +47,7 @@ {% if user_authenticated and can_edit_book %}
- + {% trans "Edit Book" %} diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index ea73f038..7eccfd65 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -295,7 +295,7 @@ urlpatterns = [ views.Book.as_view(), name="book-user-statuses", ), - re_path(r"%s/edit/?$" % BOOK_PATH, views.EditBook.as_view()), + re_path(r"%s/edit/?$" % BOOK_PATH, views.EditBook.as_view(), name="edit-book"), re_path(r"%s/confirm/?$" % BOOK_PATH, views.ConfirmEditBook.as_view()), re_path(r"^create-book/?$", views.EditBook.as_view(), name="create-book"), re_path(r"^create-book/confirm?$", views.ConfirmEditBook.as_view()),