Translation approaches
There are three strategies for translating content in Oro applications. Choose based on whether the content is static, dynamic dictionary data, or localization-specific content:Symfony Translator
Best for static UI text — form labels, flash messages, and interface strings. Editable via the Oro translations UI.
Gedmo Translatable
Best for dynamic dictionary data (e.g., Country, Region names) that must be filterable and sortable in data grids.
LocalizedFallbackValue
Best for content that needs separate values per Localization, with a fallback chain through parent localizations.
Approach comparison
| Symfony Translator | Gedmo Translatable | LocalizedFallbackValue | |
|---|---|---|---|
| Static content | Yes | No | No |
| Dynamic content | No | Yes | Yes |
| Grid filtering/sorting | N/A | Yes | No (requires extra work) |
| Per-localization values | No | No | Yes |
| Editable in UI without language switch | Yes | No | Yes |
Symfony Translator (static content)
Add translations toResources/translations/messages.en.yml:
Gedmo Translatable (dynamic dictionary data)
Mark entity fields with#[Gedmo\Translatable] and implement a translation entity:
HINT_TRANSLATABLE query hint:
LocalizedFallbackValue (per-localization content)
UseLocalizedFallbackValue for content that needs separate values per Localization:
LocalizedFallbackValueCollectionType in the form:
Additional topics
Translation Configuration
Configure debug translator, debug JS translations, and translation cache settings.
Data Fixtures
Load translatable entity data using
AbstractTranslatableEntityFixture.Schema Migrations
Add translation-related columns and tables in versioned migration scripts.
Localization
Configure locale data, name formatting, address formatting, and date/numeric formatting.
Add Translations to Source Code
Best practices for adding translation keys directly in PHP, Twig, and JS files.