Language & money
Override any string, ship a whole translation, run right-to-left, and format currency correctly anywhere in the world.
Overriding a string
Every visible string in the builder is a key — 191 of them. Block names, field labels, tabs, design names, template names, categories, buttons, empty states, validation messages, errors, dialogs, toasts, keyboard shortcuts and screen-reader announcements. There are no literal strings hiding in a component.
To see the whole vocabulary:
labels is for changing wording in one language.
To support a second language, use a locale pack instead — otherwise you end up rebuilding
the labels object every time the user switches.
Shipping a translation
Offer several and let the user choose:
Resolution order
First match wins, most specific first:
block.foo.name on screen?
That means the key exists nowhere — usually a typo, or a custom block whose
labelKey has no matching label. It is deliberately visible rather than silently
blank, so it gets fixed before release.
Right-to-left
Set direction: 'rtl' on the locale pack. The builder chrome mirrors, the canvas
mirrors, and blocks receive ctx.direction so their internal structure can mirror
too.
margin-inline-start, not margin-left. Then your block mirrors for
free instead of being the one thing on the page that faces the wrong way.
Currency
A document has one primary currency, stored as a code in
tokens.currency. Formatting happens at render time through
Intl.NumberFormat, so USD, EUR, GBP, INR, CAD, AUD, JPY, CNY, AED, SAR, CHF and
every other ISO 4217 code work with no configuration at all.
Tune presentation through tokens:
Custom currencies
Loyalty points, credits, an internal unit, a cryptocurrency — register it and it behaves like any other.
And if your business has formatting rules no standard covers, take the whole thing over:
formatCurrency.
It exists for genuinely non-standard money. For normal currencies the platform is already
correct in every locale, and more thoroughly than a hand-written formatter will be.
Money rules
1234.5 and 'EUR', never '€1.234,50'. A formatted
string cannot be re-formatted for another locale, and it silently freezes one reader's
conventions into the document.
ctx.formatMoney(value). Every visible amount in the package goes through one
function, which is why two builders on one page can use different currencies without
interfering.