Version 5.0.0

September 18, 2026

Content translation and the AI providers are new in this release and are still being proven on real sites. Static template translation is unchanged and works as it always has. Please report anything you hit at https://github.com/enupal/translate/issues — include the provider, the field type, and the relevant row from the dashboard's recent activity table.

Requires Craft 5.5.4 or later and PHP 8.2 or later.

Upgrading from Enupal Translate 4.x

Nothing to do. Your Yandex and Google credentials carry over untouched — they have simply moved from the General settings page to the new Providers page, and the bulk translation actions on the Translations page behave exactly as before. Content translation and the dashboard are switched on by default, so they are there when you want them.

Known gaps

  • The TinyMCE and Doxter serializers have not been exercised against a live install of those plugins. Every other supported field type has been, including Neo, Vizy, Hyper, Linkit, Super Table, CKEditor, Redactor, SEOmatic and Ether SEO.

Neo reads a web-only request property while saving, so translating a Neo field fails when the queue runs from the console (craft queue/listen, or a cron worker). Translating from the entry sidebar works, as does Craft's default web-based queue runner. This is a Neo limitation rather than something this plugin can work around; the job reports which element failed and why.

  • Placeholders ({{ twig }}, {param}, %s) and HTML are preserved by instructing the model, not by masking them before the request. This holds up well in testing, but a custom prompt or a smaller model makes it less certain.

Added

  • Content translation: entries, assets, categories and Commerce products can now be translated into other sites from the element index, including nested Matrix, Neo, Super Table and Content Block fields.
  • Added OpenAI and Claude (Anthropic) as translation providers, for both static and content translation.
  • Added a provider architecture: every provider now shares one interface, with a common base for LLM providers so OpenAI and Claude only implement their transport. Third-party providers can register through Providers::EVENT_REGISTER_PROVIDERS.
  • Added field serializers for Plain Text, Table, Link, Content Block and rich text (CKEditor, Redactor, TinyMCE), plus dedicated handling for Vizy, Hyper, Linkit, SEOmatic and Ether SEO — 16 field types in total.
  • Added an enupal-translate/translate/fields console command reporting which fields in an install can be translated, and why any are skipped. Third-party fields can register through Content::EVENT_REGISTER_SERIALIZERS.
  • The dashboard opens on the last 30 days rather than an empty range, and the date inputs show it.
  • The dashboard's recent activity table shows 10 rows per page, with a pager that keeps the active filters.
  • Added a dashboard reporting translation counts, token usage, API calls and failures, with filters by date, provider, type and target language, and a button to purge metrics.
  • The default content translation provider is chosen under Settings → Providers. The sidebar pre-selects it on every entry, and its dropdown swaps provider for a one-off translation without changing the default.
  • Added an Enupal Translate panel to the sidebar of entry, asset, category and product edit screens, for translating the element you're looking at into one site or all of them. It also explains itself when no provider is configured yet, so the feature is discoverable.
  • Added queue jobs for content translation and for large static translation batches.
  • Added shared AI settings for protected terms and tone of voice.
  • Added an enupal-translate:translateContent permission.
  • Added enupal-translate/translate/providers and enupal-translate/translate/test console commands for checking provider configuration.

Changed

  • Settings are now split across General, Providers and Content pages. Existing Yandex and Google credentials are carried over untouched; they have simply moved to the Providers page.
  • When no default content provider has been chosen, the most capable enabled provider is used rather than whichever was registered first — so a site with both a Google Cloud key and the free endpoint enabled no longer falls back to the scraper.
  • Bulk static translation actions are now generated from whichever providers are enabled, rather than being hard-coded.
  • Batches are de-duplicated before being sent, so a string that repeats is only translated (and billed) once.
  • Failed provider requests are now retried with exponential backoff on rate limits and server errors.

Fixed

  • Fixed a 500 error when applying the dashboard filters. Craft's date fields post an array of date/locale/timezone parts rather than a string, which was being passed straight into a DateTime constructor.
  • Fixed dashboard dates shifting back a day. A date typed into the control panel means that day in the site's timezone, but Craft reads a bare date as UTC unless told otherwise, so any site at a negative offset saw the range move.
  • Fixed saving an entry triggering a translation. The sidebar panel rendered a <form> inside Craft's own entry form; nested forms are invalid HTML, so the browser hoisted its hidden inputs into the outer form and Save submitted the translate action instead of saving the entry. The panel now posts over AJAX and contains no form or named inputs.
  • Fixed the translated draft being reported as the live entry. saveTarget() swapped in the newly created draft locally, so callers were handed the untouched canonical element — the success message said "translated" rather than "saved as a draft", and the link went to the live entry showing the old content.
  • The success message now says whether the result was saved as a draft, at what time, and links straight to it.
  • Fixed a TypeError on the entry, asset and category indexes: the bulk action was registered against RegisterComponentTypesEvent instead of RegisterElementActionsEvent.
  • Provider errors now report the API's own message instead of Guzzle's full HTTP dump.
  • A 429 caused by an exhausted quota is no longer retried, since waiting cannot resolve it.
  • Google Translate (Free) requests are now paced, and a rate limit is no longer retried — retrying a throttled scrape only deepens the block. Whatever was translated before the block is kept rather than discarded, and the error explains that the free endpoint is scraped rather than an official API.
  • Partial results from any provider are now kept when a batch fails partway, instead of being thrown away and paid for again.
  • The sidebar warns when the entry has unsaved changes, since translation reads the saved version.
  • Fixed Google Translate (Free) mis-aligning results: strings were joined with || and split apart again, which silently attributed translations to the wrong source string whenever the separator did not survive translation. Yandex and Google Cloud now use their native batch APIs, and each free-Google string is sent on its own request.
  • Fixed deprecation notices on PHP 8.4 from implicitly nullable parameters.

Version 4.1.2

July 23, 2025

Fixed

  • Fixed error generating empty translations when saving (#62)

Version 4.1.1

January 9, 2025

Fixed

  • Fixed error when only one site introduced on Craft CMS v5.5.4 (#74)

Version 4.1.0

January 7, 2025

Fixed

  • Fixed Variable "elementInstance" does not exist error introduced on Craft CMS v5.5.4 (#74)

Version 4.0.3

August 26, 2024

Fixed

  • Fixed the issue where the source column was not shown on the index page (#71)

Version 4.0.2

June 22, 2024

Fixed

  • Fixed issue when having one site (#68)

Version 4.0.1

March 31, 2024

Updated

  • Updates changelog

Version 4.0.0

March 29, 2024

Added

  • Added Craft CMS 5 support

Version 3.1.0

August 30, 2023

Added

  • Adds support to the enupal-translate/translate/sync craft command to sync translations from DB (#61)

Fixed

  • Fixed issue on Craft 4.5 (#64)

Version 3.0.1

July 12, 2022

Fixed

  • Fixed issue on mysql (#56)
  • Fixed issue where there is only one site on Craft CMS (#55)

Version 3.0.0

May 20, 2022

Added

  • Added Craft CMS 4 support

Version 2.3.0

January 12, 2022

Fixed

  • Fixed guzzle error (#43)

Version 2.2.1

April 14, 2021

Fixed

  • Revert mysql change (#41)

Version 2.2.0

April 10, 2021

Fixed

  • Fixed issue on mysql 8 (#41)

Updated

  • Updated requirement craftcms/cms ^3.6.0 (#43)
  • Updated requirement stichoza/google-translate-php" 4.1.4

Version 2.0.0

November 16, 2020

The most requested feature is here, Sync your static translations into your database without no extra queries that may impact your page load time. docs. Enjoy!

Added

  • Added support to Sync translations with Database. (#34)

Version 1.3.1

October 26, 2020

Fixed

  • Fixes issue with composer v2

Version 1.3.0

June 29, 2020

Fixed

  • Fixed issue with Yandex lib

Version 1.2.2

April 19, 2020

Added

  • Added guzzlehttp/guzzle ^6.3.0 (#30)

Version 1.2.1

March 23, 2020

Fixed

  • Fixed issue on "Google Translate Free" (#28)

Version 1.2.0

January 27, 2019

Added

  • Added Craft 3.1 requirement
  • Added twig search method under general Settings
  • Added regex search API
  • Added twig search Legacy method
  • Added twig search optimized method
  • Added php search method
  • Added js search method

Version 1.1.8

December 22, 2018

Fixed

  • Fixed issue on Craft 3.1

Version 1.1.7

December 18, 2018

Added

  • Added support for import csv files

Version 1.1.6

November 20, 2018

Added

  • Added support for "CMD + S" shortcut

Fixed

  • Fixed issue when only one site available to translate in dropdown was not saving

Version 1.1.5

October 24, 2018

Fixed

  • Fixed issue with regional codes when using Google Cloud Translate
  • Fixed Argument 1 passed to craft\services\TemplateCaches::includeElementInTemplateCaches() must be of the type integer, string given error

Version 1.1.4

October 12, 2018

Improved

-Improved folder location of assets

Fixed

  • Fixed bug when using Google Translate API

Version 1.1.3

September 12, 2018

Added

  • Added plugin name override setting

Version 1.1.2

July 7, 2018

Fixed

  • Fixes issue with Yandex when using lang by region in the Site settings. #4
  • Fixed bug when selecting a template folder source

Version 1.1.1

July 5, 2018

Fixed

  • Fixed bug when selecting a template source

Version 1.1.0

July 2, 2018

Improved

  • Improved template sources

Version 1.0.5

April 3, 2018

Improved

  • Improved code inspections

Version 1.0.4

March 14, 2018

Fixed

  • Fixed composer error

Version 1.0.3

March 2, 2018

Fixed

  • Fixed composer error

Version 1.0.2

March 2, 2018

Improved

  • Improved UI labels

Version 1.0.1

February 25, 2018

Improved

  • Improved code conventions

Version 1.0.0

February 24, 2018

Added

  • Initial release