PHPackages                             digitalpulsebe/craft-multi-translator - 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. digitalpulsebe/craft-multi-translator

ActiveCraft-plugin[Localization &amp; i18n](/categories/localization)

digitalpulsebe/craft-multi-translator
=====================================

Translate content of elements using the external services

2.23.2(1mo ago)35.1k—7.1%10[5 issues](https://github.com/digitalpulsebe/craft-multi-translator/issues)proprietaryPHPCI passing

Since Oct 12Pushed 1mo ago2 watchersCompare

[ Source](https://github.com/digitalpulsebe/craft-multi-translator)[ Packagist](https://packagist.org/packages/digitalpulsebe/craft-multi-translator)[ RSS](/packages/digitalpulsebe-craft-multi-translator/feed)WikiDiscussions develop Synced 1mo ago

READMEChangelog (10)Dependencies (6)Versions (104)Used By (0)

Multi Translator
================

[](#multi-translator)

Translate your site content using Deepl, Google Translate or ChatGPT.

Requirements
------------

[](#requirements)

This plugin requires Craft CMS 4 or Craft CMS 5.

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

[](#installation)

You can install this plugin from the [Plugin Store](https://plugins.craftcms.com/multi-translator) or with Composer.

#### From the Plugin Store

[](#from-the-plugin-store)

Go to the Plugin Store in your project’s Control Panel and search for “Multi Translator”. Then press “Install”.

#### With Composer

[](#with-composer)

Open your terminal and run the following commands:

```
composer require digitalpulsebe/craft-multi-translator -w && php craft plugin/install multi-translator
```

when using DDEV:

```
ddev composer require digitalpulsebe/craft-multi-translator -w && ddev exec php craft plugin/install multi-translator
```

Translation Services
--------------------

[](#translation-services)

For now, we support these API services:

- Deepl - Create your account at [Deepl](https://www.deepl.com/nl/pro-api) to get an API Key
    - with support for [Glossaries](#manage-glossaries)
- Google Cloud Translation - Create an API key in your [Cloud Console](https://console.cloud.google.com/)
- OpenAI (ChatGPT) - Create an API key in at [OpenAI](https://platform.openai.com/)

Roadmap
-------

[](#roadmap)

Please let us know which API's and features are desired for this plugin!

Plugin Settings
---------------

[](#plugin-settings)

Configure options in the Craft control panel settings

[![Screenshot](resources/img/screenshot_settings.png)](resources/img/screenshot_settings.png)

Permissions
-----------

[](#permissions)

For non-admin users, enable permissions under the 'Multi Translator' section:

- 'Manage settings'
    - this will allow CMS users to enter an API key an edit general settings
- 'Translate Content'
    - enables the element actions to [translate one-by-one](#translate-one-by-one)
- 'Translate Content in bulk (element action)'
    - enables the bulk actions to [translate one-by-one](#translate-in-bulk)

Supported field types
---------------------

[](#supported-field-types)

- craft\\fields\\PlainText
- craft\\fields\\Table
- craft\\redactor\\Field
- craft\\ckeditor\\Field
- craft\\fields\\Link
- verbb\\vizy\\fields\\VizyField
- craft\\fields\\Matrix (recursive)
- benf\\neo\\Field (recursive)
- verbb\\supertable\\fields\\SuperTableField (recursive)
- lenz\\linkfield\\fields\\LinkField
- verbb\\hyper\\fields\\HyperField
- nystudio107\\seomatic\\fields\\SeoSettings
- ether\\seo\\fields\\SeoField

Usage
-----

[](#usage)

There are two ways to trigger a translation.

### Translate one-by-one

[](#translate-one-by-one)

1. Navigate to the entry on the desired source site/language.
2. Use the buttons in the sidebar and select the target language.

(you can reverse this flow by setting the default direction in the configuration)

[![Screenshot](resources/img/screenshot_sidebar.png)](resources/img/screenshot_sidebar.png)

### Translate in bulk

[](#translate-in-bulk)

1. Navigate to overview of entries you want to get translated.
2. Select the entries in the source language.
3. Use the 'Translate to' dropdown in the actions bar and choose the target language
4. A queue job will be started

[![Screenshot](resources/img/screenshot_actions.png)](resources/img/screenshot_actions.png)

### Manage Glossaries

[](#manage-glossaries)

When using DeepL API, you can add a glossary for [supported language pairs](https://developers.deepl.com/docs/api-reference/glossaries). When translating, the plugin will search a glossary for the appropriate source and target language. There can only be **one glossary for each language pair**.

[![Screenshot](resources/img/screenshot_glossaries.png)](resources/img/screenshot_glossaries.png)

Extending with events
---------------------

[](#extending-with-events)

You can add your own logic by listening to these events:

### The `beforeElementTranslation` event

[](#the-beforeelementtranslation-event)

Example:

```
use digitalpulsebe\craftmultitranslator\events\ElementTranslationEvent;
use digitalpulsebe\craftmultitranslator\services\TranslateService;

Event::on(
    TranslateService::class,
    TranslateService::EVENT_BEFORE_ELEMENT_TRANSLATION,
    function (ElementTranslationEvent $event) {
        $sourceElement = $event->sourceElement;
        $sourceSite = $event->sourceSite;
        $targetSite = $event->targetSite;

        if ($sourceSite->handle == 'disabledSite') {
            $event->isValid = false; // cancel translation for this scenario
        }
    }
);
```

### The `afterElementTranslation` event

[](#the-afterelementtranslation-event)

Example:

```
use digitalpulsebe\craftmultitranslator\events\ElementTranslationEvent;
use digitalpulsebe\craftmultitranslator\services\TranslateService;
use digitalpulsebe\craftmultitranslator\MultiTranslator;

Event::on(
    TranslateService::class,
    TranslateService::EVENT_AFTER_ELEMENT_TRANSLATION,
    function (ElementTranslationEvent $event) {
        $event->targetElement->slug = MultiTranslator::getInstance()->translate->translateText(
            $event->sourceSite->language,
            $event->targetSite->language,
            $event->sourceElement->slug
        );
    }
);
```

### The `beforeFieldTranslation` event

[](#the-beforefieldtranslation-event)

Example:

```
use digitalpulsebe\craftmultitranslator\events\FieldTranslationEvent;
use digitalpulsebe\craftmultitranslator\services\TranslateService;

Event::on(
    TranslateService::class,
    TranslateService::EVENT_BEFORE_FIELD_TRANSLATION,
    function (FieldTranslationEvent $event) {
        if ($event->field->handle == 'fieldTable') {
            $event->isValid = false; // cancel translation for this field
        }
    }
);
```

### The `afterFieldTranslation` event

[](#the-afterfieldtranslation-event)

Example:

```
use digitalpulsebe\craftmultitranslator\events\FieldTranslationEvent;
use digitalpulsebe\craftmultitranslator\services\TranslateService;

Event::on(
    TranslateService::class,
    TranslateService::EVENT_AFTER_FIELD_TRANSLATION,
    function (FieldTranslationEvent $event) {
        if ($event->field->handle == 'body') {
            $event->translatedValue = 'CUSTOM VALUE';
        }
    }
);
```

###  Health Score

47

—

FairBetter than 94% of packages

Maintenance68

Regular maintenance activity

Popularity31

Limited adoption so far

Community21

Small or concentrated contributor base

Maturity59

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 96.6% of commits — single point of failure

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 ~9 days

Total

99

Last Release

59d ago

Major Versions

1.17.0 → 2.13.02025-05-26

1.18.0 → 2.15.02025-06-20

1.18.1 → 2.16.02025-07-04

1.19.0 → 2.19.02025-09-19

1.19.1 → 2.23.02026-02-05

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/102023374?v=4)[Jonathan De Baere](/maintainers/jodeba)[@jodeba](https://github.com/jodeba)

![](https://www.gravatar.com/avatar/fefb6475730ac948fa01153dea60fef3e12e3ee5909c0eb2dca0300bcef03d98?d=identicon)[bartdigitalpulse](/maintainers/bartdigitalpulse)

---

Top Contributors

[![jodeba](https://avatars.githubusercontent.com/u/102023374?v=4)](https://github.com/jodeba "jodeba (424 commits)")[![taylordaughtry](https://avatars.githubusercontent.com/u/3781851?v=4)](https://github.com/taylordaughtry "taylordaughtry (3 commits)")[![bartdigitalpulse](https://avatars.githubusercontent.com/u/75615033?v=4)](https://github.com/bartdigitalpulse "bartdigitalpulse (3 commits)")[![IrateGod](https://avatars.githubusercontent.com/u/4604584?v=4)](https://github.com/IrateGod "IrateGod (2 commits)")[![pascal-blaser](https://avatars.githubusercontent.com/u/116191091?v=4)](https://github.com/pascal-blaser "pascal-blaser (2 commits)")[![HigumaSan4050](https://avatars.githubusercontent.com/u/62851271?v=4)](https://github.com/HigumaSan4050 "HigumaSan4050 (2 commits)")[![birgerstoeckelmann](https://avatars.githubusercontent.com/u/10415259?v=4)](https://github.com/birgerstoeckelmann "birgerstoeckelmann (1 commits)")[![shoored](https://avatars.githubusercontent.com/u/26165948?v=4)](https://github.com/shoored "shoored (1 commits)")[![S-n-d](https://avatars.githubusercontent.com/u/46485243?v=4)](https://github.com/S-n-d "S-n-d (1 commits)")

### Embed Badge

![Health badge](/badges/digitalpulsebe-craft-multi-translator/health.svg)

```
[![Health](https://phpackages.com/badges/digitalpulsebe-craft-multi-translator/health.svg)](https://phpackages.com/packages/digitalpulsebe-craft-multi-translator)
```

###  Alternatives

[boxblinkracer/phpunuhi

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

83225.2k17](/packages/boxblinkracer-phpunuhi)[acclaro/translations

Easily launch and manage multilingual Craft websites without having to copy/paste content or manually track updates.

1229.5k](/packages/acclaro-translations)[om/potrans

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

10515.0k4](/packages/om-potrans)[mage-os/module-automatic-translation

Automatic AI content translation for Mage-OS.

277.1k](/packages/mage-os-module-automatic-translation)[enupal/translate

Translate your website templates and plugins into multiple languages. Bulk translation with Google Translate or Yandex.

1172.1k](/packages/enupal-translate)[itsmattburgess/laravel-translate

Populate laravel translation files using services such as Google Translate

222.5k](/packages/itsmattburgess-laravel-translate)

PHPackages © 2026

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