Content: Blog

Technical articles

Automating translations with django CMS and DeepL

Corentin Bettiol

March 31, 2026

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:

  1. Create and publish target-language content first (so target pages exist)
  2. 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:

  1. You click Translate to in the django CMS toolbar and choose a target language,
  2. The app lists page plugins and detects which fields are translatable from the plugin configuration,
  3. Optional contrib packages can extend this behavior for plugin ecosystems beyond core setups,
  4. The app prepares a JSON-like payload containing plugin data and extracted textual content,
  5. This payload is sent to the DeepL API,
  6. DeepL returns translated text, which the app maps back into the right plugin fields,
  7. The app creates the target-language page content and imports translated plugins into placeholders,
  8. 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, and suggest_deepl_plugin_config can 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

  1. Install the package and its dependencies

    poetry add djangocms-deepl-translations
    
  2. Add the apps to your INSTALLED_APPS

    "djangocms_deepl_translations",
    "djangocms_transfer",
    
  3. Set your API key using DJANGOCMS_DEEPL_TRANSLATIONS_API_KEY in your settings

  4. Run migrations

  5. 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.


Do you want to test django CMS?

Try django CMS