Manages translations across campaigns, canvases, email templates, and content blocks for multi-language messaging.
─────────────────────────────────────────────────Here is the skill file body:
This skill covers Braze's translation management system across all content types. A strategist using this skill thinks in terms of global reach: how to systematically scale messaging to multilingual audiences by managing translation state, locale coverage, and content lifecycle consistently across campaigns, canvases, email templates, and content blocks.
Beta status: All translation API endpoints are in early access / beta. Anticipate instability and verify endpoint availability with the Braze team before building production workflows on them.
Use this skill when:
Do not use for general content strategy questions unrelated to language variants or locale management.
A Braze strategist approaches localization not as a translation task but as a content governance problem: ensuring every message variant, in every locale, reflects the correct source at the right time. This means:
| Topic | What It Covers |
|---|---|
| iOS SDK Localization | Built-in SDK string overrides for default UI messages (e.g., network error strings); override via Localizable.strings |
| Campaigns — Overview | Conceptual model for managing translations within campaign message variants |
| Campaigns — GET Translations | Retrieve all translations for each message variant in a campaign (campaigns.translations.get) |
| Campaigns — GET Source | Retrieve default source values from {% translation %} tags in campaign content |
| Campaigns — PUT Update | Update one or more translations for a campaign variant (campaigns.translations.put) |
| Canvas — Overview | Conceptual model for managing translations within Canvas steps |
| Canvas — GET Translations | Preview a translated message for a Canvas step (canvas.translations.get) |
| Canvas — PUT Update | Update multiple translations for a Canvas step; draft required for live canvases |
| Email Templates — Overview | Conceptual model for managing translations within email templates |
| Email Templates — GET Translations | View all translations and locales for an email template (templates.translations.get) |
| Email Templates — GET Locale | View a specific locale's translation for an email template |
| Email Templates — GET Source | Retrieve source translations for an email template (templates.email.info) |
| Email Templates — PUT Update | Update translations for an email template (templates.email.update) |
| Content Blocks — Overview | Conceptual model for managing translations within content blocks |
| Content Blocks — GET Translations | Retrieve all translations for a content block, with optional locale filter (content_blocks.translations.get) |
| Content Blocks — PUT Update |
All translation endpoints share a consistent pattern. Use this as a quick reference:
| Content Type | GET All Translations | GET Source | PUT Update |
|---|---|---|---|
| Campaign | GET /campaigns/translations | GET /campaigns/translations (source flag) | PUT /campaigns/translations |
| Canvas | GET /canvas/translations | — | PUT /canvas/translations |
| Email Template | GET /templates/email/translations/ | GET /templates/email/translations/source | PUT /templates/email/translations/ |
| Content Block | GET /content_blocks/translations | — | PUT /content_blocks/translations |
Permission naming pattern: {resource}.translations.get / {resource}.translations.put
Rate limit: Translation endpoints share a dedicated rate limit tier — check with Braze for current limits before batch operations.
1. GET source — identify authoritative source strings
2. GET translations — compare locale coverage against source
3. Identify gaps (missing locales, stale translations)
4. PUT update — submit updated translations per locale
5. GET translations — verify update was applied correctly
For canvases that are live: save as draft before step 4, or the PUT will be rejected.
The iOS SDK ships with default UI strings (e.g., "Cannot establish network connection. Please try again later."). These can be overridden per locale using a standard Localizable.strings file. This is separate from the API-based translation system and applies only to SDK-rendered UI surfaces, not to message content.
| Mistake | Consequence | Fix |
|---|---|---|
| PUTting translations to a live Canvas without drafting | API rejects the update | Save Canvas as draft first |
| Using wrong permission scope | 403 errors on translation endpoints | Match {resource}.translations.get/put exactly |
| Treating beta endpoints as stable | Breakage without notice | Pin API version, monitor changelog |
| Assuming Content Blocks translations propagate instantly | Stale content in live messages | Verify propagation before campaign launch |
| Skipping source GET before PUT | Overwriting translations with misaligned source | Always fetch source before updating |
{% translation id %} tags — Liquid-style tags that mark translatable content within message bodies; the source GET endpoints extract values from theseen-US, fr-FR); verify locale identifiers match exactly between your TMS and Braze★ Insight ─────────────────────────────────────
─────────────────────────────────────────────────Update multiple translations for a content block (content_blocks.translations.put) |