I Dug Into Wagtail's i18n Code. Here's What I Found.
March 20, 2026 • 3 min read
I've been spending a lot of time reading through Wagtail's source code and wagtail-localize recently, preparing a GSoC 2026 proposal for the Multilingual support improvements project. Two things stood out to me as I went through the codebase, and I haven't been able to stop thinking about them since.
You can't change a page's language after you create it
In Wagtail, every page has a locale field that tells the system what language it belongs to. The problem? Once you create a page, that field is locked. editable=False. Set once, never changed.
This causes real problems. Imagine a content editor creates a new page and picks the wrong language by mistake. There's no "change locale" button. Their only option is to delete the page and start over. All their work, gone.
Looking at the source code, I started to understand why it's locked. Changing locale isn't a simple field update. It would ripple through the whole page tree: URL paths would need recalculation, child content would need updating, and the translation tracking system (which enforces unique_together = [("translation_key", "locale")]) would need to be migrated. The developers made it immutable to avoid silent data corruption. Smart call, but it means there's no safe workflow for users who need to move content between languages.
The interesting part? The building block already exists: CreatePageAliasAction accepts an update_locale parameter. The primitive is there. What's missing is a user-facing workflow that wraps it safely.

Translators can't compare versions side by side
When a translator works on a French version of a page, they need to see the English original and their translation at the same time. Wagtail's current preview system builds a read-only snapshot via get_ephemeral_translated_instance(). But there's no diff view, no change highlighting, and no way to see what changed between versions.
Translators work around this by switching browser tabs or keeping printed copies. Not ideal for a CMS used by NASA and the UK National Health Service😅.
Why this matters
These aren't edge cases. They're daily friction for content teams managing multilingual websites. I've been discussing the implementation approach in the Wagtail GSoC Q&A thread, and the conversation with the maintainers has been incredibly helpful in shaping my thinking on how to tackle these gaps.
More to come as the proposal takes shape 🚀