You are viewing beta documentation for Formie 4.x.
Forms

Translations

Formie handles text on forms in three separate ways. Each has its own purpose — form copy from the builder, Formie-owned UI strings, and project-level developer strings.

Three layers

LayerWhat it coversWhere it lives
Form contentLabels, placeholders, messages, option labels, notification copyForm builder (database). Per-site wording via site overrides on multi-site projects.
Formie static stringsValidation templates, (optional), file-upload prompts, payment UI labelstranslations/{locale}/formie.php and Formie’s bundled translation files
Project stringsCustom client event templates, developer-defined labels outside Formie formstranslations/{locale}/site.php

Form content is not translated through Craft’s message system at render time. After site overrides are merged, Formie outputs the string from the database as-is.

When to use what

Multi-site form copy

Use the form builder site switcher and content translation overrides. This is the supported way to give each Craft site different labels or messages while sharing one form structure.

Site overrides are keyed by Craft site, not locale file. That matters when two sites share a language but need different wording — for example en-US and en-AU with different labels for the same field.

Single-site projects

Write copy directly in the form builder. You do not need translation files for field labels or form messages.

Use formie.php only if you want to override Formie-owned UI strings (see below).

Formie-owned strings (formie category)

Use translations/{locale}/formie.php for strings Formie owns — strings passed to Craft::t('formie', '…') with a fixed English source key in the plugin.

Examples:

// translations/de/formie.php
return [
    '{label} cannot be blank.' => '{label} darf nicht leer sein.',
    '(optional)' => '(optional)',
    'Are you sure you want to leave?' => 'Möchten Sie die Seite wirklich verlassen?',
    'Drop files here or browse to upload.' => 'Dateien hier ablegen oder zum Hochladen durchsuchen.',
];

These keys must match the English source string in the plugin exactly. Formie does not use separate message IDs.

Front-end JavaScript validation messages are seeded from the same strings via Rendering::getFrontendJsTranslations(). Override them in formie.php the same way.

Project strings (site category)

Use translations/{locale}/site.php for your own plugin, module, or template strings — not for form field labels created in the Formie builder.

Formie uses site in a few places for Craft element names (for example site names in the builder site switcher). That follows Craft conventions for project-level copy.

What does not belong in translation files

Do not put form builder content in formie.php or site.php:

  • Field labels, instructions, placeholders
  • Page labels and submit/back/save button labels
  • Dropdown, radio, or checkbox option labels
  • Success, error, limit, or scheduling messages
  • Notification subject or body edited in the form builder

Field labels and form messages belong in the form builder (or site overrides on multi-site projects), not in translation files. If your project still has entries like 'Your name' => 'Votre nom' in formie.php, move that wording into the builder — see Upgrading From v3 → Form content translations.

Multi-site vs static files

ApproachPer Craft siteEditor-managedSame language, different sites
CP site overridesYesYesYes
formie.phpNo (per locale only)No (deploy)No

For multi-site forms, prefer CP overrides. Static formie.php files remain the right place for plugin UI strings only.

Rendering behaviour

When a form is rendered — via Twig, GraphQL, or the React bootstrap — Formie:

  1. Loads the canonical form from the form’s source site.
  2. Merges site overrides for the current site when multi-site is enabled.
  3. Outputs user-authored strings without passing them through Craft::t().

Plugin-owned strings (validation defaults, required indicators, upload prompts) still use Craft::t('formie', …) and your locale’s formie.php overrides.

Submissions load forms with the same site override merge, so notifications and exports use the wording for the submission’s site.

Troubleshooting

French site shows English field labels

You need French site overrides in the form builder, not entries in formie.php.

German source site shows English labels

Check the canonical labels on the source site in the builder. Form content is stored and output as written.

Validation messages stay in English

Add overrides to translations/{locale}/formie.php for the English source keys (for example {label} cannot be blank.), or set plugin-wide defaults under Formie → Settings → Defaults.

Two English sites need different labels

Use CP site overrides. A single translations/en/formie.php file cannot distinguish between Craft sites.