@@ -12,6 +12,47 @@ Versions follow [PEP 440](https://peps.python.org/pep-0440/). The version in
1212` pyproject.toml ` is the only place it is written; the git tag and the GitHub
1313Release are derived from it (see [ docs/contributing.md] ( docs/contributing.md ) ).
1414
15+ ## 4.3.0
16+
17+ ### Added
18+
19+ - ** Translation catalogs.** ` django_mfa/locale/ ` now ships ` django.pot ` (75
20+ entries) and machine-drafted ` .po ` files for ` de ` , ` es ` , ` fr ` , ` pt_BR ` ,
21+ ` ja ` and ` zh_Hans ` . Every entry is marked ` fuzzy ` , so gettext ignores it
22+ and users still see English: ** no language is live yet** , and a draft only
23+ starts appearing after a human reviews it and removes the flags. See
24+ [ docs/translations.md] ( docs/translations.md ) . No compiled ` .mo ` files
25+ ship, because a fully fuzzy catalog compiles to an empty one.
26+ - The Python side is now translatable, matching the templates (which already
27+ were): the verification error, the passkey sign-in error, each adapter's
28+ ` verbose_name ` , and ` Authenticator.Type ` 's labels. Wrapping the ` Type `
29+ labels needs ** no migration** — a ` gettext_lazy ` proxy compares equal to
30+ the string it wraps, so the autodetector sees no change to ` choices `
31+ (verified on Django 4.2, 5.2 and 6.1).
32+
33+ - ** Django 6.1 support** , now claimed in the classifiers and exercised in CI
34+ on Python 3.12 and 3.13. Django 6.x requires Python 3.12+, so the matrix
35+ excludes it on 3.10/3.11; those interpreters keep Django 4.2 and 5.2, both
36+ still LTS. No source change was needed — the suite already passed on 6.x.
37+ (Django 6.0 passes too, but is not claimed or tested.)
38+
39+ ### Changed
40+
41+ - The PyPI classifier is now ` Development Status :: 5 - Production/Stable ` ,
42+ up from ` 4 - Beta ` .
43+ - ` publish.yml ` 's pre-release smoke matrix now tests the newest supported
44+ corner as Python 3.13 + Django 6.1, up from 3.13 + 5.2. The oldest corner
45+ (3.10 + 4.2) is unchanged.
46+
47+ ### Fixed
48+
49+ - ` .gitignore ` 's blanket ` *.pot ` /` *.mo ` rules excluded the package's own
50+ catalogs. Because hatchling honours ` .gitignore ` at build time, an ignored
51+ catalog is also an unshipped one — Django would find no locale directory
52+ in the installed package and silently fall back to English. Negations now
53+ keep ` django_mfa/locale/ ` tracked, and ` test_packaging.py ` asserts the
54+ catalogs are in the built wheel.
55+
1556## 4.2.0
1657
1758### Added
0 commit comments