Translate your DatoCMS content into every locale of your project with DeepL, OpenAI, Google Gemini, Anthropic Claude or Yandex Translate. Translate a single field, a whole record, a selection of records or entire models, without leaving DatoCMS.
![A blog post open on its Italian tab with the title and content translated, next to the AI Translations sidebar panel listing each finished field and locale, such as "Title" to Italian [it], and a notice asking to review the translations and save](https://plugins-cdn.datocms.com/datocms-plugin-ai-translations@3.7.5/docs/record-translated.png)
Install AI Translations from Configuration → Plugins and, when asked, let it use the current user's API token. Bulk translations need it to read and save records. Without it, the table action and the Bulk translations page can't run.
Then open the plugin settings, pick an AI Vendor, enter its credentials and click Save. Your project needs at least two locales.
DeepL is the fastest and cheapest option, and it's what we recommend for most projects. OpenAI, Gemini and Claude are language models: they also get the record's title and other short text fields as context, which helps with tone and terminology, and you can edit the Translation prompt they follow.
| AI Vendor | What you need |
|---|---|
| DeepL | A DeepL API key. For a Free-plan key, turn on Use DeepL Free endpoint (api-free.deepl.com). It turns on by itself for keys ending in :fx. Test API Key checks the key. |
| OpenAI (ChatGPT) | An OpenAI API key, then a GPT Model from the list of models your key can use. |
| Google (Gemini) | A Google API key from a project with the Generative Language API enabled, then a Gemini Model. |
| Anthropic (Claude) | An Anthropic API key, then a Claude Model. |
| Yandex Translate | A service-account API key with the yc.ai.translate.execute scope, from an account with the ai.translate.user role. Yandex Folder ID is optional. Test credentials checks them. |
The same page lets you choose the Fields that can be translated and turn the sidebar panel or the table action off. Turn on Show exclusion rules to hide the plugin from some models or roles, or to skip specific fields. DeepL glossaries, the prompt and the other provider options are described in docs/Providers.md.
Open the menu at the top right of a localized field, choose Translate to, then a locale or All locales. Translate from works the other way round: it fills the locale you're on with a translation of another locale.
The translation goes into the form, so review it and click Save. Translate to only appears once the field has content in the locale you're on.
The AI Translations panel in the record sidebar translates every translatable field at once.
Cancel stops the run. Fields that were already translated stay in the form.
Unlike the field menu and the sidebar, bulk translations save each record as soon as it's translated. In models with draft/published, the changes stay unpublished until you publish them.
Open Configuration → Bulk translations, under AI Translations in the sidebar. Only roles that can edit the schema see it.
Pick the locales, then the Models to translate: every record of those models is translated. Each model gets its own field picker, with all its translatable fields selected. Click Translate records, confirm, and follow the run in the same Translation progress dialog. If the button is disabled, hover it to see what's missing.

Block models aren't listed, because blocks are translated together with the records that contain them.
The progress dialog counts successful and failed records as the run goes. Each row links to its record, which opens in a new tab. Hover a row to see the details of a warning or an error. Cancel stops the run, and records that were already saved stay translated.
| Status | What it means |
|---|---|
| Translated | The selected fields were translated and the record was saved. |
| — with warnings | The record was saved, but needs a look. Usually linked records were copied into a new locale, or one field was skipped because the provider returned an error. |
| No eligible fields to translate | The selected fields are empty in the source locale, so nothing changed. |
| Missing source locale | The record has no content in the source locale. |
| Failed or No fields were updated | The record couldn't be translated or saved. Hover the row to see why. |
Why are linked records copied? A link field points to other records, which are the same in every locale, so the plugin never translates it. When a bulk run fills a locale for the first time, it copies the links from the source locale so the record stays valid, for example when the field requires at least one linked record. The linked records themselves aren't translated. The warning lets you check whether the new locale should link to different records.
Publishing. When the run ends, Publish all translated records (N) publishes every record that was updated, if its model uses draft/published. If publishing stops partway, click Retry publishing remaining (N).
From this directory:
npm cinpm run devnpm testnpm run lintnpm run buildConnect the development URL to a test project using the DatoCMS plugin development workflow. The release history is in the changelog.