Settings
Open Settings -> Plugins -> i18n (or the plugin's own Settings nav item
inside the i18n CP section) to configure the defaults used by new translation
jobs and by the console commands. Individual translation jobs (see
Usage) can override the provider, source/target site, sections and
safety flags per job — the settings below are the plugin-wide defaults.
provider, googleApiKey, geminiApiKey, chatgptApiKey, deepLApiKey and
libreTranslateApiKey can additionally be overridden per Craft site, so a
multi-site install can use a different provider or API key per target
language.
Translation providers
| Setting | Type | Default | Purpose |
|---|---|---|---|
provider | string | mymemory | Default provider handle used when a job does not define its own provider sequence. |
fallbackProviders | array | ['mymemory'] | Providers tried in order, after the primary one, when a translation request fails or the provider is unavailable. |
providerCooldownMs | int (ms) | 100 | Minimum delay enforced between two requests to the same provider, to avoid rate limiting. |
providerErrorCooldownMs | int (ms) | 300 | How long a provider is paused after it returns an error, before i18n tries it again. |
Supported provider handles, and the API key setting each one needs:
| Handle | Provider | Requires API key | Settings field |
|---|---|---|---|
mymemory | MyMemory | no | — (free, rate-limited public API) |
libretranslate | LibreTranslate | optional | libreTranslateApiKey, libreTranslateEndpoint (defaults to https://libretranslate.com/translate, can point at a self-hosted instance) |
apertium | Apertium | no | — |
argostranslate | Argos Translate | no | — |
lingva | Lingva | no | — |
google | Google Translate | yes | googleApiKey |
gemini | Google Gemini | yes | geminiApiKey, geminiModel (default gemini-2.5-flash) |
chatgpt | OpenAI ChatGPT | yes | chatgptApiKey, chatgptModel (default gpt-4o-mini) |
deepl | DeepL | yes | deepLApiKey |
MyMemory is the default because it needs no API key, but it is rate-limited
and best suited for low-volume or evaluation use — for a production
multi-language store, configuring DeepL, Google or an LLM provider (with its
own API key) as the primary provider, with MyMemory left in
fallbackProviders as a free last resort, is the recommended setup.
Default languages, sites and sections
| Setting | Type | Default | Purpose |
|---|---|---|---|
sourceLanguage | string (ISO 639-1) | en | Default source language for new jobs. |
targetLanguage | string (ISO 639-1) | en | Default target language for new jobs. |
sourceSiteId | int|null | null | Default Craft site to pull canonical (source) content from. |
targetSiteId | int|null | null | Default Craft site to write translations into. |
sectionIds | array<int> | [] | Sections included when queueing translations via php craft i18n/translate/queue (see Developer). |
Batching, queue and cron behavior
| Setting | Type | Default | Purpose |
|---|---|---|---|
batchSize | int | 20 | Entries translated per batch inside a running job. |
batchPauseMs | int (ms) | 0 | Pause between batches during long-running jobs. |
cronBatchSize | int | 50 | Entries processed per run when triggered from cron/CLI (i18n/translate/queue). |
queuePriority | int | 1024 | Craft queue priority used when pushing translation jobs. |
queueTtrSeconds | int | 300 | Maximum seconds a queue runner reserves the job for (time-to-run). |
queueMaxAttempts | int | 3 | Queue retry attempts before a job is marked failed. |
queueEntryLimit | int | 500 | Maximum entries translated in a single queue run. |
errorThreshold | int | 3 | Errors allowed per entry before it is skipped (blocked) until statistics are cleared. |
continueOnError | bool | true | If enabled, job execution moves on to the next provider/entry after a failure instead of stopping the whole job. |
Safety flags
| Setting | Type | Default | Purpose |
|---|---|---|---|
alwaysTranslateFields | bool | false | When enabled, target fields are overwritten every run, even if already translated/populated. When disabled (default), a field that already has translated content is skipped. |
skipMismatchedTargets | bool | true | When enabled, an entry whose target content has diverged from a straight translation (e.g. a translator hand-edited it) is left alone, so i18n does not silently overwrite manual edits. Only takes effect when alwaysTranslateFields is off. |
logStatistics | bool | true | Whether detailed translation statistics are logged for reporting/digest purposes. |
Individual jobs also have their own translateUntranslatedOnly flag
(default true), which skips entries the job has already translated, so
re-running a job only picks up new/changed entries.
Digest email
| Setting | Type | Default | Purpose |
|---|---|---|---|
digestRecipients | string | '' | Comma-separated list of email addresses that receive the statistics digest. |
digestFrequency | string | daily | One of hourly, two-hourly, daily. Controls both the scheduled digest cadence and the minimum interval enforced before another digest is sent for the same window. |
The digest can also be triggered on demand from the CP (Settings → Send
digest) or from the console (php craft i18n/statistics/send-digest, see
Developer).
License
pluginLicenseEntitlementToken, pluginLicenseEntitlements,
pluginLicenseLastValidatedAt, pluginLicenseGraceUntil and
pluginLicenseItems store the plugin's license activation state and are
managed automatically by the CP license flow (i18n/license); they are not
meant to be edited by hand. dashboardLayout stores the saved layout of the
i18n dashboard widgets.