Translate your site content using Deepl, Google Translate or ChatGPT.
This plugin requires Craft CMS 4 or Craft CMS 5.
You can install this plugin from the Plugin Store or with Composer.
Go to the Plugin Store in your project’s Control Panel and search for “Multi Translator”. Then press “Install”.
Open your terminal and run the following commands:
composer require digitalpulsebe/craft-multi-translator -w && php craft plugin/install multi-translatorwhen using DDEV:
ddev composer require digitalpulsebe/craft-multi-translator -w && ddev exec php craft plugin/install multi-translatorFor now, we support these API services:
- Deepl - Create your account at Deepl to get an API Key
- with support for Glossaries
- Google Cloud Translation - Create an API key in your Cloud Console
- OpenAI (ChatGPT) - Create an API key in at OpenAI
Please let us know which API's and features are desired for this plugin!
Configure options in the Craft control panel settings
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 Content in bulk (element action)'
- enables the bulk actions to translate one-by-one
- craft\fields\PlainText
- craft\fields\Table
- craft\redactor\Field
- craft\ckeditor\Field
- 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
There are two ways to trigger a translation.
- Navigate to the entry on the desired source site/language.
- Use the buttons in the sidebar and select the target language.
(you can reverse this flow by setting the default direction in the configuration)
- Navigate to overview of entries you want to get translated.
- Select the entries in the source language.
- Use the 'Translate to' dropdown in the actions bar and choose the target language
- A queue job will be started
When using DeepL API, you can add a glossary for supported language pairs. 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.
You can add your own logic by listening to these events:
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
}
}
);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
);
}
);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
}
}
);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';
}
}
);


