From fca9b6155d4759f2e3c499f6c07d3659d940b86e Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 3 Apr 2024 23:10:21 -0400 Subject: [PATCH] basic i18n support --- .gitignore | 4 + Dockerfile | 3 +- boofilsic/settings.py | 18 +- catalog/common/models.py | 2 +- catalog/music/models.py | 3 +- catalog/templates/item_base.html | 2 +- catalog/views.py | 6 +- common/templatetags/duration.py | 6 + journal/models/__init__.py | 10 +- journal/models/mark.py | 15 + journal/models/review.py | 1 - journal/models/shelf.py | 309 ++- journal/templates/mark.html | 4 +- journal/views/common.py | 4 +- journal/views/mark.py | 6 +- journal/views/profile.py | 4 +- locale/zh_Hans/LC_MESSAGES/django.po | 2301 ++++++++++++++++++++ mastodon/api.py | 18 +- requirements-dev.txt | 2 +- social/templates/activity/review_item.html | 2 +- takahe/utils.py | 15 +- users/data.py | 5 + users/middlewares.py | 16 + users/migrations/0020_user_language.py | 23 + users/models/user.py | 10 + users/templates/users/preferences.html | 10 + 26 files changed, 2709 insertions(+), 90 deletions(-) create mode 100644 locale/zh_Hans/LC_MESSAGES/django.po create mode 100644 users/middlewares.py create mode 100644 users/migrations/0020_user_language.py diff --git a/.gitignore b/.gitignore index a71a14bd..9639de2c 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,7 @@ log # test coverage /.coverage + + +# translations +*.mo diff --git a/Dockerfile b/Dockerfile index cf1c6341..1916ed33 100644 --- a/Dockerfile +++ b/Dockerfile @@ -36,13 +36,14 @@ RUN --mount=type=cache,sharing=locked,target=/var/cache/apt-run apt-get update \ RUN busybox --install # postgresql and redis cli are not required, but install for development convenience -RUN --mount=type=cache,sharing=locked,target=/var/cache/apt-run apt-get install -y --no-install-recommends postgresql-client redis-tools +RUN --mount=type=cache,sharing=locked,target=/var/cache/apt-run apt-get install -y --no-install-recommends postgresql-client redis-tools gettext RUN useradd -U app RUN rm -rf /var/lib/apt/lists/* COPY --from=build /neodb /neodb WORKDIR /neodb COPY --from=build /neodb-venv /neodb-venv +RUN /neodb-venv/bin/django-admin compilemessages RUN NEODB_SECRET_KEY="t" NEODB_SITE_DOMAIN="x.y" NEODB_SITE_NAME="z" /neodb-venv/bin/python3 manage.py compilescss RUN NEODB_SECRET_KEY="t" NEODB_SITE_DOMAIN="x.y" NEODB_SITE_NAME="z" /neodb-venv/bin/python3 manage.py collectstatic --noinput diff --git a/boofilsic/settings.py b/boofilsic/settings.py index af7ca52b..7c5f4a97 100644 --- a/boofilsic/settings.py +++ b/boofilsic/settings.py @@ -41,6 +41,8 @@ env = environ.FileAwareEnv( ), # Links in site footer NEODB_SITE_LINKS=(dict, {}), + # Default language + NEODB_LANGUAGE=(str, "zh-hans"), # Invite only mode # when True: user will not be able to register unless with invite token # (generated by `neodb-manage invite --create`) @@ -323,7 +325,8 @@ MIDDLEWARE = [ "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", "hijack.middleware.HijackUserMiddleware", - "django.middleware.locale.LocaleMiddleware", + # "django.middleware.locale.LocaleMiddleware", + "users.middlewares.LanguageMiddleware", "tz_detect.middleware.TimezoneMiddleware", "auditlog.middleware.AuditlogMiddleware", # "maintenance_mode.middleware.MaintenanceModeMiddleware", # this should be last if enabled @@ -384,15 +387,12 @@ if SLACK_TOKEN: MARKDOWNX_MARKDOWNIFY_FUNCTION = "journal.models.render_md" -# Internationalization -# https://docs.djangoproject.com/en/3.0/topics/i18n/ - -LANGUAGE_CODE = "zh-hans" +LANGUAGE_CODE = env("NEODB_LANGUAGE", default="zh-hans") # type: ignore LOCALE_PATHS = [os.path.join(BASE_DIR, "locale")] -# LANGUAGES = ( -# ("en", _("English")), -# ("zh-hans", _("Simplified Chinese")), -# ) +LANGUAGES = ( + # ("en", _("English")), + ("zh-hans", _("Simplified Chinese")), +) TIME_ZONE = env("NEODB_TIMEZONE", default="Asia/Shanghai") # type: ignore diff --git a/catalog/common/models.py b/catalog/common/models.py index d122fd1f..65a8d565 100644 --- a/catalog/common/models.py +++ b/catalog/common/models.py @@ -118,7 +118,7 @@ class ItemType(models.TextChoices): PodcastEpisode = "podcastepisode", _("Podcast Episode") Performance = "performance", _("Performance") PerformanceProduction = "production", _("Production") - FanFic = "fanfic", _("Fanfix") + FanFic = "fanfic", _("Fanfic") Exhibition = "exhibition", _("Exhibition") Collection = "collection", _("Collection") diff --git a/catalog/music/models.py b/catalog/music/models.py index c00e3f99..606bdcea 100644 --- a/catalog/music/models.py +++ b/catalog/music/models.py @@ -2,6 +2,7 @@ from datetime import date from django.db import models from django.utils.translation import gettext_lazy as _ +from django.utils.translation import pgettext_lazy from catalog.common import ( BaseSchema, @@ -66,7 +67,7 @@ class Album(Item): default=list, ) genre = jsondata.ArrayField( - verbose_name=_("genre"), + verbose_name=pgettext_lazy("music", "genre"), base_field=models.CharField(blank=True, default="", max_length=50), null=True, blank=True, diff --git a/catalog/templates/item_base.html b/catalog/templates/item_base.html index a4984772..7146fe9e 100644 --- a/catalog/templates/item_base.html +++ b/catalog/templates/item_base.html @@ -54,7 +54,7 @@ {% if request.user.is_authenticated and not mark.shelf_type %}
- {% for k, v in shelf_labels %} + {% for k, v in shelf_actions %} {% if v and k != 'dropped' %}