From ed2fcbb97ba685f76963d4ccaf83f22f9de752cb Mon Sep 17 00:00:00 2001 From: Brian Pepple Date: Thu, 13 Aug 2026 11:48:43 -0400 Subject: [PATCH 1/3] Add i18n infrastructure: locale settings, LocaleMiddleware, language switcher Lay the groundwork for translating Metron (#593): LANGUAGES/LOCALE_PATHS settings, LocaleMiddleware, the i18n template context processor, the set_language URL, and a cookie-based language switcher in the navbar. No user-facing strings are marked up for translation yet. --- metron/settings.py | 11 +++++++++++ metron/urls.py | 3 ++- templates/base.html | 4 ++-- templates/partials/language_switcher.html | 21 +++++++++++++++++++++ templates/partials/navbar.html | 2 ++ 5 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 templates/partials/language_switcher.html diff --git a/metron/settings.py b/metron/settings.py index cea311c0..6cfba5c4 100644 --- a/metron/settings.py +++ b/metron/settings.py @@ -87,6 +87,7 @@ MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.locale.LocaleMiddleware", "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", @@ -112,6 +113,7 @@ "django.contrib.messages.context_processors.messages", "comicsdb.context_processors.announcement_context_processor", "sekizai.context_processors.sekizai", + "django.template.context_processors.i18n", ], # Bulma templatetags for project. "libraries": { @@ -274,6 +276,15 @@ LANGUAGE_CODE = "en-us" +LANGUAGES = [ + ("en", "English"), + ("it", "Italiano"), +] + +LOCALE_PATHS = [ + BASE_DIR / "locale", +] + TIME_ZONE = "America/New_York" USE_I18N = True diff --git a/metron/urls.py b/metron/urls.py index 5d33efd4..468c3a39 100644 --- a/metron/urls.py +++ b/metron/urls.py @@ -9,7 +9,7 @@ from django.templatetags.static import static from django.urls import include, path from django.views.generic import RedirectView, TemplateView -from django.views.i18n import JavaScriptCatalog +from django.views.i18n import JavaScriptCatalog, set_language from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView from api import urls as api_urls @@ -61,6 +61,7 @@ path("imprint/", include(imprint_urls)), path("issue/", include(issue_urls)), path("issue-ratings/", include(issue_ratings_urls)), + path("i18n/setlang/", set_language, name="set_language"), path("jsi18n/", JavaScriptCatalog.as_view(), name="javascript-catalog"), path("publisher/", include(publisher_urls)), path("polls/", include(polls_urls)), diff --git a/templates/base.html b/templates/base.html index 3be10c82..76098337 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,6 +1,6 @@ -{% load static django_htmx %} +{% load static django_htmx i18n %} - + diff --git a/templates/partials/language_switcher.html b/templates/partials/language_switcher.html new file mode 100644 index 00000000..13cad8da --- /dev/null +++ b/templates/partials/language_switcher.html @@ -0,0 +1,21 @@ +{% load i18n %} + diff --git a/templates/partials/navbar.html b/templates/partials/navbar.html index ecfbd6fb..e67f2f13 100644 --- a/templates/partials/navbar.html +++ b/templates/partials/navbar.html @@ -1,4 +1,5 @@ {% load static %} +{% load i18n %}