PHPackages                             sitegeist/lostintranslation - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Localization &amp; i18n](/categories/localization)
4. /
5. sitegeist/lostintranslation

ActiveNeos-package[Localization &amp; i18n](/categories/localization)

sitegeist/lostintranslation
===========================

Automatic content translations for Neos using the DeepL Api

v3.2.0(2mo ago)1342.1k↓38.6%18[8 issues](https://github.com/sitegeist/Sitegeist.LostInTranslation/issues)[10 PRs](https://github.com/sitegeist/Sitegeist.LostInTranslation/pulls)3GPL-3.0-or-laterPHPPHP &gt;=8.2.0CI passing

Since Nov 5Pushed 1mo ago3 watchersCompare

[ Source](https://github.com/sitegeist/Sitegeist.LostInTranslation)[ Packagist](https://packagist.org/packages/sitegeist/lostintranslation)[ RSS](/packages/sitegeist-lostintranslation/feed)WikiDiscussions 3.0 Synced 3d ago

READMEChangelog (10)Dependencies (37)Versions (82)Used By (3)

Sitegeist.LostInTranslation
===========================

[](#sitegeistlostintranslation)

Automatic Translations for Neos via DeeplApi
--------------------------------------------

[](#automatic-translations-for-neos-via-deeplapi)

Documents and contents are translated automatically once editors choose to "create and copy" a version in another language. The included DeeplService can be used for other purposes as well.

The development was a collaboration of Sitegeist and Code Q.

### Authors &amp; Sponsors

[](#authors--sponsors)

- Martin Ficzel -
- Felix Gradinaru -

*The development and the public releases of this package are generously sponsored by our employers  and .*

Installation
------------

[](#installation)

Sitegeist.LostInTranslation is available via Packagist. Run `composer require sitegeist/lostintranslation`.

We use semantic versioning so every breaking change will increase the major version number.

How it works
------------

[](#how-it-works)

By default, all inline editable properties are translated using DeepL (see setting `translateInlineEditables`). To include other `string` properties in the automatic translation, the `options.automaticTranslation: true`can be used in the property configuration. Also, you can disable automatic translation in general for certain node types by setting `options.automaticTranslation: false`.

Some very common fields from `Neos.Neos:Document` are already configured to do so by default.

```
'Neos.Neos:Document':
  options:
      automaticTranslation: true
  properties:
    title:
      options:
        automaticTranslation: true
    titleOverride:
      options:
        automaticTranslation: true
    metaDescription:
      options:
        automaticTranslation: true
    metaKeywords:
      options:
        automaticTranslation: true
```

Also, automatic translation for all types derived from `Neos.Neos:Node` is enabled by default:

```
'Neos.Neos:Node':
  options:
      automaticTranslation: true
```

Configuration
-------------

[](#configuration)

This package needs an authenticationKey for the DeepL API from . There are free plans that support a limited number, but for productive use we recommend using a paid plan.

```
Sitegeist:
  LostInTranslation:
    DeepLApi:
      authenticationKey: '.........................'
```

The translation of nodes is configured via settings:

```
Sitegeist:
  LostInTranslation:
    nodeTranslation:
      #
      # Enable the automatic translations of nodes while they are adopted to another dimension
      #
      enabled: true

      #
      # Translate all inline editable fields without further configuration.
      #
      # If this is disabled, inline editables can be configured for translation by setting
      # `options.translateOnAdoption: true` for each property separately
      #
      translateInlineEditables: true

      #
      # The name of the language dimension. Usually needs no modification
      #
      languageDimensionName: 'language'
```

If a preset of the language dimension uses a locale identifier that is not compatible with DeepL, the `deeplLanguage` can be configured explicitly for this preset via `options.deeplLanguage`.

```
Neos:
  ContentRepository:
    contentDimensions:
      'language':

        #
        # The `defaultPreset` marks the source for all translations with mode `sync`
        #
        label: 'Language'
        default: 'en'
        defaultPreset: 'en'

        presets:

          #
          # English has to be configured differently for source and target as DeepL requires so,
          # the source and target are separated by a `:`
          #
          'en':
            label: 'English'
            values: ['en']
            uriSegment: 'en'
            options:
              deeplLanguage: 'EN:EN-GB'

          #
          # Danish uses a different locale identifier than DeepL, so the `deeplLanguage` has to be configured explicitly
          #
          'dk':
            label: 'Dansk'
            values: ['dk']
            uriSegment: 'dk'
            options:
              deeplLanguage: 'DA'

          #
          # For German, the dimension value de is used in uppercase
          #
          'de':
            label: 'Deutsch'
            values: ['de']
            uriSegment: 'de'

          #
          # The Bavarian language is not supported by DeepL and is disabled
          #
          'de_bar':
            label: 'Bayrisch'
            values: ['de_bar','de']
            uriSegment: 'de_bar'
            options:
              deeplLanguage: false
```

### Glossaries

[](#glossaries)

Glossaries are created and uploaded to DeepL via the Lost in Translation Backend Module. When node-translations are created the matching glossary for the language combination at hand is chosen automatically.

Glossary names are internally prefixed with a configurable identifier that ensures that different Neos instances that share a DeepL account will not interfere by cleaning up each others glossaries.

By default the prefix is the `FLOW_CONTEXT` as this is already configured in all Neos Instances and is often used to seperate multiple environments.

**⚠️ If you use multiple environments with the same FLOW\_CONTEXT and DeepL Account you should ensure that the glossary.labelPrefix is configured differently for each environment.**

```
Sitegeist:
  LostInTranslation:
    DeepLApi:
        #
        # Glossary management
        #
        glossary:
            #
            # The label prefix can be used to prevent different instances overwriting or deleting each others
            # glossaries. The default value is the FLOW_CONTEXT but this may need adjustment based on your use case
            #
            labelPrefix: '%env:FLOW_CONTEXT%'
            #
            # The number of outdated remote glossaries to keep to reduce problems when systems are cloned
            #
            keepNumber: 10
```

The commands `./flow glossary:uploadall` and `./flow glossary:cleanupall` allow to automate those tasks and may be integrated in backup and restore or synchronization scripts.

### Ignoring Terms

[](#ignoring-terms)

You can define terms that should be ignored by DeepL in the configuration. The terms are evaluated case-insensitively when searching for them, however they will always be replaced with their actual occurrence.

This is how an example configuration could look like:

```
Sitegeist:
  LostInTranslation:
    DeepLApi:
      ignoredTerms:
        - 'Sitegeist'
        - 'Neos.io'
        - 'Hamburg'
```

Eel Helper
----------

[](#eel-helper)

The package also provides two Eel helpers to translate texts in Fusion.

**⚠️ Every one of these Eel helpers makes an individual request to DeepL.**Thus, having many of them on one page can significantly slow down the performance if the page is uncached. :bulb: Only use while the [translation cache](#translation-cache) is enabled!

To translate a single text you can use:

```
# ${Sitegeist.LostInTranslation.translate(string textToBeTranslated, string targetLanguage, string|null sourceLanguage = null): string}
${Sitegeist.LostInTranslation.translate('Hello world!', 'de', 'en')}
# Output: Hallo Welt!

```

To translate an array of texts you can use:

```
# ${Sitegeist.LostInTranslation.translate(array textsToBeTranslated, string targetLanguage, string|null sourceLanguage = null): array}
${Sitegeist.LostInTranslation.translate(['Hello world!', 'My name is...'], 'de', 'en')}
# Output: ['Hallo Welt!', 'Mein Name ist...']

```

### Translation Cache

[](#translation-cache)

The plugin includes a translation cache for the DeepL API that stores the individual text parts and their translated results for up to one week. By default, the cache is enabled. To disable the cache, you need to set the following setting:

```
Sitegeist:
  LostInTranslation:
    DeepLApi:
      enableCache: false
```

### Content Governance Mode

[](#content-governance-mode)

To exactly track what write operations have been performed by human editors or their translation assistant, you can enable content governance mode by enabling the respective AuthProvider:

```
Neos:
  ContentRepositoryRegistry:
    presets:
      # or whatever preset you use
      default:
        authProvider:
          factoryObjectName: Sitegeist\LostInTranslation\ContentRepository\AuthProvider\AIAwareContentRepositoryAuthProviderFactory
```

Performance
-----------

[](#performance)

For every translated node, a single request is made to the DeepL API. This can lead to significant delay when documents with lots of nodes are translated. It is likely that future versions will improve this.

Contribution
------------

[](#contribution)

We will gladly accept contributions. Please send us pull requests.

Changelog
---------

[](#changelog)

### 2.0.0

[](#200)

- The preset option `translationStrategy` was introduced. There are now two auto-translation strategies:
    - Strategy `once` will auto-translate the node once "on adoption", i.e. the editor switches to a different language dimension
    - Strategy `sync` will auto-translate and sync the node every time a node is updated in the default preset language
- The node setting `options.translateOnAdoption` has been renamed to `options.automaticTranslation`
- The new node option `options.automaticTranslation` was introduced

###  Health Score

59

—

FairBetter than 98% of packages

Maintenance77

Regular maintenance activity

Popularity40

Moderate usage in the ecosystem

Community29

Small or concentrated contributor base

Maturity78

Established project with proven stability

 Bus Factor2

2 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~65 days

Recently: every ~10 days

Total

26

Last Release

67d ago

Major Versions

v2.4.0 → v3.0.0-beta12025-03-17

v2.4.1 → v3.0.12025-06-11

v2.5.1 → v3.0.22025-07-10

v2.6.1 → v3.1.02026-03-06

v2.7.0 → 3.0.x-dev2026-04-28

PHP version history (3 changes)v2.3.0PHP &gt;=8.0.0

v2.4.0PHP &gt;=8.1.0

v3.0.0-beta1PHP &gt;=8.2.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/51e0a02d8e12b73949ec858638aa7e295e103022cc5a879f86ac8532c2c170bd?d=identicon)[sitegeist](/maintainers/sitegeist)

![](https://www.gravatar.com/avatar/829b4ccb51e8cff3c1e4b59d60cfe8d1b86f6d77fc31a6b3fc99227f432542ca?d=identicon)[mficzel](/maintainers/mficzel)

---

Top Contributors

[![mficzel](https://avatars.githubusercontent.com/u/1309380?v=4)](https://github.com/mficzel "mficzel (106 commits)")[![gradinarufelix](https://avatars.githubusercontent.com/u/4405087?v=4)](https://github.com/gradinarufelix "gradinarufelix (91 commits)")[![hphoeksma](https://avatars.githubusercontent.com/u/250683?v=4)](https://github.com/hphoeksma "hphoeksma (4 commits)")[![lorenzulrich](https://avatars.githubusercontent.com/u/1816023?v=4)](https://github.com/lorenzulrich "lorenzulrich (3 commits)")[![hedayati-m](https://avatars.githubusercontent.com/u/66601551?v=4)](https://github.com/hedayati-m "hedayati-m (3 commits)")[![jonnitto](https://avatars.githubusercontent.com/u/4510166?v=4)](https://github.com/jonnitto "jonnitto (3 commits)")[![mwuest](https://avatars.githubusercontent.com/u/3205472?v=4)](https://github.com/mwuest "mwuest (2 commits)")[![kitsunet](https://avatars.githubusercontent.com/u/324408?v=4)](https://github.com/kitsunet "kitsunet (1 commits)")[![MiauzGenau](https://avatars.githubusercontent.com/u/46249106?v=4)](https://github.com/MiauzGenau "MiauzGenau (1 commits)")[![nezaniel](https://avatars.githubusercontent.com/u/1687674?v=4)](https://github.com/nezaniel "nezaniel (1 commits)")[![rolandschuetz](https://avatars.githubusercontent.com/u/735982?v=4)](https://github.com/rolandschuetz "rolandschuetz (1 commits)")

---

Tags

i18ntranslation

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP\_CodeSniffer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/sitegeist-lostintranslation/health.svg)

```
[![Health](https://phpackages.com/badges/sitegeist-lostintranslation/health.svg)](https://phpackages.com/packages/sitegeist-lostintranslation)
```

###  Alternatives

[neos/neos-base-distribution

Neos Base Distribution

4366.0k](/packages/neos-neos-base-distribution)[neos/neos

An open source Content Application Platform based on Flow. A set of core Content Management features is resting within a larger context that allows you to build a perfectly customized experience for your users.

1151.0M778](/packages/neos-neos)[mage-os/module-automatic-translation

Automatic AI content translation for Mage-OS.

3017.9k](/packages/mage-os-module-automatic-translation)[boxblinkracer/phpunuhi

Easy tool to work with translation files for validation, exports, imports and more.

83260.1k26](/packages/boxblinkracer-phpunuhi)[om/potrans

Command line tool for translate Gettext with Google Translator API or DeepL API

10520.2k9](/packages/om-potrans)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
