diff --git a/journal/templates/collection.html b/journal/templates/collection.html
index a7a8dfeb..c571d059 100644
--- a/journal/templates/collection.html
+++ b/journal/templates/collection.html
@@ -63,7 +63,9 @@
{% for cat, count in collection.get_summary.items %}
- {% if count %}{{ count }} {{ cat|prural_items }} {% endif %}
+ {% if count %}
+ {% prural_items count cat %}
+ {% endif %}
{% endfor %}
{% if featured_since %}
diff --git a/journal/templatetags/collection.py b/journal/templatetags/collection.py
index 8aeebb1c..11b4e1a1 100644
--- a/journal/templatetags/collection.py
+++ b/journal/templatetags/collection.py
@@ -1,5 +1,6 @@
from django import template
from django.template.defaultfilters import stringfilter
+from django.utils.translation import ngettext
from journal.models import Collection
from journal.models.mixins import UserOwnedObjectMixin
@@ -27,24 +28,42 @@ def user_stats_of(collection: Collection, identity: APIdentity):
return collection.get_stats(identity) if identity else {}
-@register.filter(is_safe=True)
-@stringfilter
-def prural_items(category: str):
- # TODO support i18n here
- # return _(f"items of {category}")
- if category == "book":
- return "本书"
- elif category == "movie":
- return "部电影"
- elif category == "tv":
- return "部剧集"
- elif category == "album" or category == "music":
- return "张专辑"
- elif category == "game":
- return "个游戏"
- elif category == "podcast":
- return "个播客"
- elif category == "performance":
- return "场演出"
- else:
- return category
+@register.simple_tag()
+def prural_items(count: int, category: str):
+ match category:
+ case "book":
+ return ngettext("%(count)d book", "%(count)d books", count,) % {
+ "count": count,
+ }
+ case "movie":
+ return ngettext("%(count)d movie", "%(count)d movies", count,) % {
+ "count": count,
+ }
+ case "tv":
+ return ngettext("%(count)d tv show", "%(count)d tv shows", count,) % {
+ "count": count,
+ }
+ case "music":
+ return ngettext("%(count)d album", "%(count)d albums", count,) % {
+ "count": count,
+ }
+ case "game":
+ return ngettext("%(count)d game", "%(count)d games", count,) % {
+ "count": count,
+ }
+ case "podcast":
+ return ngettext("%(count)d podcast", "%(count)d podcasts", count,) % {
+ "count": count,
+ }
+ case "performance":
+ return ngettext(
+ "%(count)d performance",
+ "%(count)d performances",
+ count,
+ ) % {
+ "count": count,
+ }
+ case _:
+ return ngettext("%(count)d item", "%(count)d items", count,) % {
+ "count": count,
+ }
diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po
index e79eea57..8238dbee 100644
--- a/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/locale/zh_Hans/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-05-20 11:52-0400\n"
+"POT-Creation-Date: 2024-05-20 18:21-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -857,12 +857,12 @@ msgid "Are you sure to delete?"
msgstr "确认删除吗?"
#: catalog/templates/catalog_delete.html:47
-#: catalog/templates/catalog_merge.html:91
+#: catalog/templates/catalog_merge.html:91 neodb-takahe/activities/admin.py:25
msgid "Yes"
msgstr "是"
#: catalog/templates/catalog_delete.html:48
-#: catalog/templates/catalog_merge.html:92
+#: catalog/templates/catalog_merge.html:92 neodb-takahe/activities/admin.py:26
msgid "No"
msgstr "否"
@@ -2010,6 +2010,62 @@ msgstr ""
msgid "分享"
msgstr ""
+#: journal/templatetags/collection.py:36
+#, python-format
+msgid "%(count)d book"
+msgid_plural "%(count)d books"
+msgstr[0] "%(count)d 本书"
+msgstr[1] "%(count)d 本书"
+
+#: journal/templatetags/collection.py:44
+#, python-format
+msgid "%(count)d movie"
+msgid_plural "%(count)d movies"
+msgstr[0] "%(count)d 部电影"
+msgstr[1] "%(count)d 部电影"
+
+#: journal/templatetags/collection.py:52
+#, python-format
+msgid "%(count)d tv show"
+msgid_plural "%(count)d tv shows"
+msgstr[0] "%(count)d 部电视剧"
+msgstr[1] "%(count)d 部电视剧"
+
+#: journal/templatetags/collection.py:60
+#, python-format
+msgid "%(count)d album"
+msgid_plural "%(count)d albums"
+msgstr[0] "%(count)d 张专辑"
+msgstr[1] "%(count)d 张专辑"
+
+#: journal/templatetags/collection.py:68
+#, python-format
+msgid "%(count)d game"
+msgid_plural "%(count)d games"
+msgstr[0] "%(count)d 个游戏"
+msgstr[1] "%(count)d 个游戏"
+
+#: journal/templatetags/collection.py:76
+#, python-format
+msgid "%(count)d podcast"
+msgid_plural "%(count)d podcasts"
+msgstr[0] "%(count)d 个播客"
+msgstr[1] "%(count)d 个播客"
+
+#: journal/templatetags/collection.py:84
+#, python-format
+msgid "%(count)d performance"
+msgid_plural "%(count)d performances"
+msgstr[0] "%(count)d 场演出"
+msgstr[1] "%(count)d 场演出"
+
+#: journal/templatetags/collection.py:92
+#, python-format
+msgid "%(count)d item"
+msgid_plural "%(count)d items"
+msgstr[0] "%(count)d 个条目"
+msgstr[1] "%(count)d 个条目"
+
#: journal/views/collection.py:38
#, python-brace-format
msgid "Collection by {0}"
@@ -2148,6 +2204,42 @@ msgstr ""
msgid "target site domain name"
msgstr ""
+#: neodb-takahe/activities/admin.py:18
+msgid "Local Identity"
+msgstr ""
+
+#: neodb-takahe/core/admin.py:8
+msgid "config options type"
+msgstr ""
+
+#: neodb-takahe/core/admin.py:13
+msgid "System"
+msgstr "系统"
+
+#: neodb-takahe/core/admin.py:14
+msgid "Identity"
+msgstr "身份"
+
+#: neodb-takahe/core/admin.py:15
+msgid "User"
+msgstr ""
+
+#: neodb-takahe/users/admin.py:147
+msgid "Local Source Identity"
+msgstr ""
+
+#: neodb-takahe/users/admin.py:153
+msgid "Local Target Identity"
+msgstr ""
+
+#: neodb-takahe/users/views/auth.py:20
+msgid "No account was found with that email and password."
+msgstr ""
+
+#: neodb-takahe/users/views/auth.py:21
+msgid "This account is inactive."
+msgstr ""
+
#: social/templates/activity/create_collection.html:17 takahe/utils.py:553
msgid "created collection"
msgstr "创建了收藏单"
diff --git a/users/templates/users/register.html b/users/templates/users/register.html
index d33c0518..4527983c 100644
--- a/users/templates/users/register.html
+++ b/users/templates/users/register.html
@@ -40,7 +40,7 @@
placeholder="email"
autocomplete="email" />
{% if request.user.pending_email %}
- {% blocktrans pending_email=request.user.pending_email %}Please click the confirmation link in the email sent to {{ pending_email }}; if you haven't received it for more than a few minutes, please input and save again.{% endblocktrans %}
+ {% blocktrans with pending_email=request.user.pending_email %}Please click the confirmation link in the email sent to {{ pending_email }}; if you haven't received it for more than a few minutes, please input and save again.{% endblocktrans %}
{% endif %}
{% for error in form.email.errors %}{{ error }}{% endfor %}