Context
Metron is starting to see international users. This issue tracks the work to make the codebase translation-ready, in phases rather than one large change.
Decisions:
- Language switching: cookie/session-based via Django's built-in
set_language view + LocaleMiddleware. No URL prefixing (i18n_patterns) — URLs stay as they are.
- Translation workflow: a community platform (Weblate/Transifex/Crowdin style) where volunteer translators edit
.po files via a web UI, synced back via PR.
- Pilot language: Italian.
- Rollout: infra + a pilot slice first to prove the pipeline end-to-end, then roll out to the rest of the app in batches by app.
Phase 0 — Infrastructure
Phase 1 — Pilot slice (base.html/navbar/footer/messages + Issue model/form/view)
Phase 2+ — Rollout by app (smallest first)
Tooling / workflow
Status
Phase 0, 1, and 2 (full rollout across all apps and templates) are implemented locally and verified end-to-end — full test suite (1719 passed, 2 pre-existing skips), ruff clean, makemigrations --check clean, Italian .po catalog fully translated (0 fuzzy, 0 untranslated) and compiled. Added .github/pull_request_template.md with a checklist reminder to wrap new user-facing strings and run makemessages -a. Remaining work is setting up a community translation platform (Weblate-style), which is external tooling/account setup rather than a code change.
Context
Metron is starting to see international users. This issue tracks the work to make the codebase translation-ready, in phases rather than one large change.
Decisions:
set_languageview +LocaleMiddleware. No URL prefixing (i18n_patterns) — URLs stay as they are..pofiles via a web UI, synced back via PR.Phase 0 — Infrastructure
LANGUAGES/LOCALE_PATHSsettings,LocaleMiddleware, i18n context processorset_languageURL + language switcher UI in the navbarlocale/directory layout (single project-level catalog, not per-app)Phase 1 — Pilot slice (base.html/navbar/footer/messages + Issue model/form/view)
verbose_namesmessages.*()calls (f-string →%(name)s-style).pocatalog, verify end-to-end via dev serverContainerfile: compile catalogs at image build timePhase 2+ — Rollout by app (smallest first)
timeline,api(incl. 6 DRF serializer ValidationErrors)polls,pull_listwish_list,user_collectionusers(incl. account activation email)reading_liststemplates/(error pages, widget overrides)comicsdbremainder (models, forms, views, all 58 templates,statistics.pystrftime fixes)apithrottle notice/enforcement email templates (pluralization restructuring — hardest, deferred deliberately)Tooling / workflow
locale/*/LC_MESSAGES/django.poStatus
Phase 0, 1, and 2 (full rollout across all apps and templates) are implemented locally and verified end-to-end — full test suite (1719 passed, 2 pre-existing skips), ruff clean,
makemigrations --checkclean, Italian.pocatalog fully translated (0 fuzzy, 0 untranslated) and compiled. Added.github/pull_request_template.mdwith a checklist reminder to wrap new user-facing strings and runmakemessages -a. Remaining work is setting up a community translation platform (Weblate-style), which is external tooling/account setup rather than a code change.