Model Translations (i18n)
What this covers
Multi-language model metadata lets you provide translated display names for dimensions, measures, hierarchies, and other model entities. When a user selects a locale in the Explorer, all entity labels switch to that language.
How it works
Translations are stored in the entity_translations table, keyed by (model_id, entity_type, entity_id, field_name, locale). Each row maps a specific field on a specific entity to a translated string in a specific locale.
When a user sets their display locale via the Locale selector in the Explorer, the frontend fetches all translations for the active model and locale. Entity labels throughout the UI are resolved using a simple fallback: if a translation exists for the current locale, show it; otherwise, show the original name.
Setting the display locale
- Open the Workspace Explorer or the Model Builder.
- Click the Locale selector dropdown (near the user avatar or toolbar).
- Choose a locale (e.g.,
fr,de,ja,ar). - All entity labels in the current view update immediately.
The selected locale is stored in the browser session and persists across page navigations within the same session but resets on logout.
Managing translations
Translations are managed via the REST API. There is no GUI editor yet.
Upsert a single translation
PUT /api/v1/projects/{project_id}/models/{model_id}/translations
{
"entity_type": "dimension",
"entity_id": "uuid-of-the-dimension",
"field_name": "display_name",
"locale": "fr",
"translated_text": "Catégorie de produit"
}
Bulk upsert
POST /api/v1/projects/{project_id}/models/{model_id}/translations/bulk
Body: an array of translation objects. The response returns only the rows that were successfully upserted. Skipped items are logged server-side with the array index and reason.
List translations
GET /api/v1/projects/{project_id}/models/{model_id}/translations?locale=fr
Delete a translation
DELETE /api/v1/projects/{project_id}/models/{model_id}/translations/{id}
Supported entity types
| Entity type | Typical field_name | Example |
|---|---|---|
dimension | display_name | “Product Category” → “Catégorie de produit” |
measure | display_name | “Revenue” → “Chiffre d’affaires” |
hierarchy | display_name | “Date Hierarchy” → “Hiérarchie de dates” |
level | display_name | “Quarter” → “Trimestre” |
Security
All translation endpoints verify that the specified model belongs to the specified project. Attempting to manage translations for a model in a different project returns 404 Not Found.