Automating translations with django CMS and DeepL
If you run a multilingual django CMS project, you already know the friction: translating one page is easy, translating fifty pages while keeping structure, plugins, and links consistent is not.
djangocms-deepl-translations was built to solve this problem. It adds DeepL-powered translation workflows for django CMS 5+ content, with an admin "Translate to" flow and bulk commands for large sites.
Why we built it
Most teams hit the same pain points:
- Repeating manual copy/paste between languages
- Inconsistent translation quality across editors
- Plugin-heavy pages that are hard to translate safely
- Time-consuming rollouts when adding a new locale
We wanted a workflow that stays close to django CMS conventions, but scales from single-page translation to full-site operations.
What it does
Admin and bulk translation workflows
You can translate content directly from admin flows, and you can also process many pages at once with management commands such as bulk_translate_pages. The bulk process follows a practical two-phase approach:
- Create and publish target-language content first (so target pages exist)
- Run full placeholder/plugin translation This helps preserve internal consistency and improves link resolution during translation.
DeepL API integration
The integration is designed to feel simple for editors and reliable for teams; it can use glossaries to keep branded or business-critical terms consistent across languages, whether those terms are managed in DeepL or from the app's admin.
When a page is translated, the flow is straightforward:
- You click
Translate toin the django CMS toolbar and choose a target language, - The app lists page plugins and detects which fields are translatable from the plugin configuration,
- Optional contrib packages can extend this behavior for plugin ecosystems beyond core setups,
- The app prepares a JSON-like payload containing plugin data and extracted textual content,
- This payload is sent to the DeepL API,
- DeepL returns translated text, which the app maps back into the right plugin fields,
- The app creates the target-language page content and imports translated plugins into placeholders,
- The translated page content is published, so editors can review and use it immediately.
The result is a smooth flow from source content to published translated pages, without changing how your team already works in the CMS.
Plugin-aware translation configuration
Not every plugin should be sent to DeepL.
The setting DJANGOCMS_DEEPL_TRANSLATIONS_PLUGIN_CONFIG lets you define, per plugin type:
- Which fields are translatable (
translatable_fields) - Which plugin types should be skipped (
no_translation) A built-in system check can warn about unconfigured plugin types, andsuggest_deepl_plugin_configcan generate a starter config block so setup is fast and explicit.
More configuration options are described in the README.
Optional contribs
Optional integrations are available under djangocms_deepl_translations.contrib.*, including support for translating djangocms-stories content with dedicated commands.
You can write your own contribs to translate other content types, too.
Quick start
-
Install the package and its dependencies
poetry add djangocms-deepl-translations -
Add the apps to your
INSTALLED_APPS"djangocms_deepl_translations", "djangocms_transfer", -
Set your API key using
DJANGOCMS_DEEPL_TRANSLATIONS_API_KEYin your settings -
Run migrations
-
You are ready to translate!
A practical fit for multilingual teams
djangocms-deepl-translations is designed for teams who want to keep editorial workflows in django CMS, while removing repetitive translation work and reducing rollout time for new languages.
If your project mixes many plugin types and frequent content updates, this module gives you a clear, configurable, and production-friendly translation pipeline.