Skip to content
Marketing Factory Digital GmbH
Contact
Logo Marketing Factory Digital GmbH
  • Agency
    • About us
    • History
  • Services
    • Consulting, Analysis and Strategy
    • Programming and Development
      • Interface Development
      • PIM/ERP Links
      • Custom Development
      • Seamless CMS Integration
    • Hosting and Support
      • Cloud Strategies
      • Hosting Partners of Marketing Factory
    • Services with Third Parties
  • Technology
    • TYPO3
      • Current TYPO3 Versions: v12, v13
    • Shopware
    • IT Security
      • DDoS Protection
      • Continuous Upgrading
      • Privacy First
    • Tech Stack
      • Commitment to Open Source
      • Technology Selection
      • PHP Ecosystem
      • Containerisation & Clustering
      • Content Delivery Networks
      • Search Technologies
  • References
    • Projects
    • Clients
      • Client List
    • Screenshot of the homepage of the new Maxion Wheels websiteNEW: Relaunch of the corporate website of Maxion Wheels
  • Community
    • Community Initiatives
  • Blog
  • Contact
  • Deutsch
  • English

You are here:

  1. Blog
  2. Planning and performing automatic translations in TYPO3 with DeepL
The image shows two stylized content columns in TYPO3. The left column contains the English content. The right column is highlighted in blue and shows a larger version of the TYPO3 translation icon.
  • Extensions
  • TYPO3
  • Tutorial
13.11.2025

Planning and performing automatic translations in TYPO3 with DeepL


Introduction

We integrated DeepL extensions into a TYPO3 project to automatically generate translated content. Today, I will share our experiences with DeepL. I will also take this opportunity to describe the entire organizational process.

All content in the TYPO3 installation was in English and has now been translated into German for the first time. Additional languages will be added to the project in the future.

Overview

  • How to begin: Questions and tasks beforehand
  • The target language (no, really)
  • A glossary
  • The project course
  • DeepL Pro API
  • Auto synchronization on subsequent changes?
  • What exactly needs to be translated?
  • The technical part
  • DeepL extensions
  • Installation and configuration
  • Required TCA configuration
  • Language menu
  • "hreflang"-Tags
  • The editorial translation process using DeepL
  • Creating a glossary
  • How does automatic translation in the TYPO3 backend work?
  • What should be translated first?
  • Common pitfalls and limitations
  • The target language has different text lengths
  • Short text provides less context
  • Glossary synchronization
  • Short-term revision of existing content
  • Conclusion: How Deep(L) Is Your Love?

How to begin: Questions and tasks beforehand

The target language (no, really)

We need to define the language precisely before we can set it up technically. Portuguese, for example, is also the official language of Brazil. However, there are many differences in Brazilian Portuguese, both in colloquial language and in technical terms.

Therefore, it matters whether the country code is configured as pt_PT (Portuguese) or pt_BR (Brazilian Portuguese).

A glossary

Technical terms must always be translated consistently. Product names, on the other hand, may not need to be translated into the target language. In all cases, DeepL's glossary feature can help you maintain the correct terminology.

The free add-on "deepltranslate-glossary" is available for TYPO3, and we strongly recommend using it. It allows glossary entries to be created as a record in TYPO3 and synchronized with DeepL. DeepL will then use the glossary for all translations.

Your client should therefore create a glossary in advance, including the most important technical terms and further preferred translations. You or your client will then add these terms to TYPO3 before the translation process begins. Further glossary entries can be added at any time if they prove necessary in the course of the work.

The project course

The responsibilities and the specific translation process are also discussed with the client before work begins: Which pages should be translated first? Who is responsible for the legal documents, such as the data privacy policy?

DeepL Pro API

The free version of the DeepL API only includes one glossary. This may sound sufficient if you are only planning to use one new target language, but it is not:

  • Each TYPO3 installation is assigned a different glossary ID (production, staging, development or review environments, etc.).
  • Also, each language in TYPO3 creates additional glossaries in DeepL. For English, German, and Spanish, you already get four glossaries (en => es, en => de, de => es, es => de), because translated content can also be selected as the source language for further translations.

Depending on the amount of text on your website, you may also reach the monthly character limit of the free plan. This can happen especially when you are initially setting up the new language version with some trial runs.

Which means you will need a Pro account for the API. You will have to discuss the fees with your client: www.deepl.com/en/pro-api#api-pricing

Auto synchronization on subsequent changes?

This question does not need to be addressed at the beginning, but your client should be aware of this option: What should happen to existing translations when the content in the original language is updated?

Using the paid add-on “deepltranslate-auto-renew,” it is possible to automatically update existing translations with DeepL in this case.
However, it should be noted that all corrections and improvements made by an editor in the translation will, of course, be overwritten.

Therefore, it is important to consider whether auto-renewal is the right choice for your project. It is technically possible to enable or disable this option for each target language.

What exactly needs to be translated?

Translations are not limited to pages and content that editors can maintain. The website template must also be configured for multiple languages (in TYPO3 primarily using XLIFF language files): buttons and labels for the search function are defined there, as are accessibility-related labels.
Other components must also be taken into account.

We have created a checklist for new languages that includes the following steps:

  • Configuration of the language in the Site Configuration
  • Solr Core for the search index of the new language
  • Translation of the frontend labels in locallang.xlf
  • Additional translations in TypoScript (_LOCAL_LANG), if needed
  • Translation of contact forms and associated email templates
  • Translation of cookie consent
  • Creation of the specified terms in the DeepL glossary

Special attention must be paid to any legal contents, from cookie consent to the data privacy policy. Ideally, the client's legal department or a qualified person can provide a complete, legally compliant translation. Alternatively, they can perform a careful review of an automatically translated version.

The technical part

This section is intended for TYPO3 integrators and developers. Those of you who are project managers may skip to the next section without a guilty conscience.

DeepL extensions

The following TYPO3 extensions are available for installation:

ExtensionAvailabilityFunktion
deepltranslate-corefreeTranslation with DeepL in the TYPO3 backend
deepltranslate-glossaryfreeManagement of glossary entries for consistent terminology
deepltranslate-assetspaidSupport for file metadata in the file list
deepltranslate-masspaidMass translation of entire page trees or subtrees
deepltranslate-auto-renewpaidAutomatic re-translation of content when the original language content is changed

Installation and configuration

The documentation describes the necessary steps: https://docs.typo3.org/p/web-vision/deepltranslate-core/5.1/en-us/Administration/Configuration/Index.html

Required TCA configuration

As described in the documentation, the DeepL extension supports backend fields of type "Input" and "Text" (including rich text). A requirement is that the fields are configured with 'l10n_mode' => 'prefixLangTitle'. You may need to adjust this using TCA overrides. Otherwise, the contents of the field will not be translated.

$GLOBALS['TCA']['tx_news_domain_model_news']['columns']['teaser']['l10n_mode'] = 'prefixLangTitle';
$GLOBALS['TCA']['tx_news_domain_model_news']['columns']['bodytext']['l10n_mode'] = 'prefixLangTitle';
$GLOBALS['TCA']['tx_news_domain_model_news']['columns']['description']['l10n_mode'] = 'prefixLangTitle';
$GLOBALS['TCA']['tx_news_domain_model_news']['columns']['alternative_title']['l10n_mode'] = 'prefixLangTitle';

Language menu

It makes sense: as long as the translated version of the website is still in development, we probably don't want to reveal it to visitors yet. So no matter how you implement your navigation in TYPO3, make sure that the new language cannot be selected there until everything's ready.

"hreflang"-Tags

This might be less obvious: TYPO3 automatically adds tags to the source code if a page is available in other languages.

<link rel="alternate" hreflang="en-US" href="https://www.example.org/about-us/">
<link rel="alternate" hreflang="de-de" href="https://www.example.org/de/ueber-uns/">
<link rel="alternate" hreflang="x-default" href="https://www.example.org/about-us/">

These tags let Google know when you create translations. And then the translated pages appear in search results faster than you can say "noindex".

We have therefore added a small event listener to the site package, which can be used to omit the required languages from the generation of hreflang tags.

<?php

declare(strict_types=1);

namespace Mfd\MySitepackage\EventListener;

use TYPO3\CMS\Core\Attribute\AsEventListener;
use TYPO3\CMS\Frontend\Event\ModifyHrefLangTagsEvent;

/**
 * Filter/remove certain languages from the generated hreflang tags.
 * Used to prevent publishing page translations while a new frontend language is still set up.
 */
#[AsEventListener(
    identifier: 'my-sitepackage/hreflang-tag-filter',
    after: 'typo3-seo/hreflangGenerator',
)]
final readonly class HrefLangTagFilter
{
    public function __invoke(ModifyHrefLangTagsEvent $event): void
    {
        $defaultLanguages = [
            'en-US',
            'x-default'
        ];
        $disabledLanguages = [
            'de-DE',
            'fr-FR'
        ];

        $hrefLangs = $event->getHrefLangs();

        // Remove unwanted language codes from array:
        $filteredHrefLangs = array_diff_key($hrefLangs, array_flip($disabledLanguages));

        // Check if the remaining languages are only the default.
        // In that case, no hreflang tags should be rendered.
        $remainingKeys = array_keys($filteredHrefLangs);
        sort($remainingKeys);
        sort($defaultLanguages);
        if ($remainingKeys === $defaultLanguages) {
            $filteredHrefLangs = [];
        }

        $event->setHrefLangs($filteredHrefLangs);
    }
}

Once the new language version of the website is ready, you can remove the language from the event listener. So make sure to add this to your checklist.

The editorial translation process using DeepL

Show larger version for: DeepL glossary in TYPO3 with entries in German, Portuguese, and Chinese. The page displays translations for terms in multiple languages, including editing and synchronization options.
The new "Synchronise Glossaries" button is highlighted in the header. At the bottom, you can see how glossary entries are maintained: As with all other records in TYPO3, you can simply create the desired translations for each term.

Creating a glossary

First, create a "Folder" page in the TYPO3 page tree. In the "Behavior" tab of the page properties, set "Contains Plugin" to "DeepL Glossary".

It will then display a new tab where you can view the synchronization status with DeepL.

The folder now displays the new "Synchronise Glossaries" button in the page and list view. The button allows you to export your glossary entries from TYPO3 to DeepL. You need to start the synchronization after each change or addition to the glossary entries.

Lesson learned: Use a single folder for a website's glossary entries (meaning do not split your terminology into subfolders such as "Technical terms" and "Product names"). The DeepL API currently does not support multiple glossaries for the same source and target language.

Show larger version for: Page module of the TYPO3 backend: The new "Translate with DeepL" select field is highlighted in the upper area. Below it, you can see the columns of the current page and the content elements on them.
The "Translate with DeepL" select field allows you to quickly and automatically translate the page title and other page properties. All you have to do is select the desired target language.

How does automatic translation in the TYPO3 backend work?

This is the easy part: pages and content can be translated at the touch of a button. And the whole process is fast. Both the new TYPO3 database records and the translated texts are created in a matter of seconds.

In the first step, you translate the page itself with DeepL. This includes the page title, of course, but the URL segment and various metadata (description, social media) are also translated automatically.

Show larger version for: Page module of the TYPO3 backend: Displayed is the two-column module for language comparison (source language + translation). There are no translated elements in the right-hand content column yet. The button to start the translation process is highlighted.
The page itself is localized, now we can translate its content. The highlighted button will open a modal to start the translation process.
Show larger version for: Page module of the TYPO3 backend: The modal for the translation process is displayed, while the rest of the backend is covered by a dark overlay.
In the first step in the opened modal, we can select the preferred translation mode: manual (records are created in the target language, and the editor must translate the content afterwards), or two DeepL modes that will translate all content automatically.

In the second step, you can translate the content of the page. You can choose between two DeepL translation modes, which are, however, currently identical in terms of use and results. The developers of the DeepL extensions will either correct this or remove the redundant option.

What should be translated first?

We recommend starting with a number of selected pages that the client considers particularly important. Preferably, these should also contain some glossary terms. Have the translations reviewed by your editors. Where necessary, expand the glossary. Then proceed to the next series of pages.

By translating content step by step, you can identify problems early on and avoid them on subsequent pages.

News (and other plugin records) are stored in a central folder and then referenced on different pages. It makes sense to translate this content into its folders at an early stage. It ensures that the translations are already available when you translate the corresponding pages. Otherwise, a news plugin translated into German will still display the English originals in the frontend.

Common pitfalls and limitations

The target language has different text lengths

German is a language in which terms quickly grow long. I am not referring to oddities like the former "Grundstücks­verkehrs­genehmigungs­zuständigkeits­übertragungs­verordnung" (Regulation on the delegation of authority concerning land conveyance permissions).
Even the translation of “product portfolio” (7 + 9 characters) to “Produktportfolio” (16 characters without spaces) can lead to different line breaks. Or to layout problems in narrow teaser boxes.

In such cases, it is beneficial to have the option to set soft hyphens for conditional line breaks in the text field. However, this is an editorial adjustment that must be performed manually during the final review.

Short text provides less context

The shorter the original text, the more scope for interpretation DeepL has when translating it. Many terms can be translated in different ways, leading to very different meanings. This can quickly lead to incorrect or even absurd results.

  • "Quality policy" (meaning a guideline) becomes "Qualitätspolitik" (Quality politics)
  • "Light is the new green", a reference to environmentally friendly lightweight vehicle wheels, becomes "Licht ist das neue Grün" (meaning illumination)
  • "[Client name] on the road" (on travel) becomes "[Kundenname] auf der Straße" (in the street)

DeepL tends to translate terms literally rather than according to their meaning.

Glossary synchronization

Occasionally, using the DeepL buttons returns no translated text. The target language records will then contain the unchanged original text.

In such cases, clicking the “Synchronize glossaries” button and then restarting the translation process has always helped.

Short-term revision of existing content

Experience shows that no matter how thoroughly your client works on their website, when translating, they will always find content that is outdated or needs to be revised. This can delay the translation process, at the very least.

Conclusion: How Deep(L) Is Your Love?

I myself have been using DeepL for years, both professionally and personally, primarily for translations from German to English. And yet I never use the initial result. I adjust sentences and phrasing according to my personal preference and occasionally correct grammar. Sometimes I have translations rechecked by Grammarly.
Fun fact: this is precisely how I created the English version of this article.

Can I recommend automated translations in TYPO3? Yes, absolutely. It makes work much easier and saves time.
But does it have to be a fully automated solution, or should editors check every translation afterwards? You'll need to answer this question together with your client for each project.

Sebastian Klein

Standing somewhere between the front-end and back-end. With a soft spot for usability and documentation. Always on the lookout for good practices.

More posts by this author

Get blog posts as RSS feed

Related blog posts

  • Using Our TYPO3 Extension ai_filemetadata with Mittwald’s AI Hosting
  • We’re Retiring beuser_iprange
  • Relaunch of the website of our client Maxion Wheels based on TYPO3 12.4 LTS
  • EXT:oauth2 available for TYPO3 v11 and PHP 8

Please feel free to share this article.


Comments

No comments yet.

Write a comment.

I have been informed that the processing of my data is on a voluntary basis and that I can refuse my consent without detrimental consequences for me or withdraw my consent at any time to Marketing Factory Digital GmbH by mail (Erkrather Straße 401, D-40231 Düsseldorf) or e-mail (info@marketing-factory.de).

I understand that the above data will be stored for as long as I wish to be contacted by Marketing Factory. After my revocation my data will be deleted. Further storage may take place in individual cases if this is required by law.

  • Data privacy policy
  • Legal notice

© Marketing Factory Digital GmbH

Picture Credits