Type an ICU MessageFormat string — plural, select, selectordinal, and number / date placeholders — supply variable values, and preview the rendered output across multiple locales side by side. Powered entirely by the browser's Intl.PluralRules, Intl.NumberFormat, and Intl.DateTimeFormat; nothing leaves your machine.
Hi {name}!
Total: {amount, number, ::currency/USD}
Posted: {date, date, medium}
Simple {name} inserts a value. With a type and style: number / date / time.
{n, plural,
=0 {none}
one {# item}
other {# items}}
Categories: zero one two few many other, plus exact =N matches. # is the formatted number. selectordinal uses ordinal categories (1st, 2nd, 3rd…).
{gender, select,
male {his profile}
female {her profile}
other {their profile}}
other is required as the fallback branch.
Use '{name}' as a literal.
Use '#' to escape the hash.
A single quote escapes the next ICU syntax character. Two single quotes '' render as a literal apostrophe.
Sub-messages inside plural / select branches can contain other placeholders — very useful for translated UI strings with mixed values.
Covers the common subset of ICU MessageFormat used by FormatJS, Crowdin, Transifex, and the iOS / Android stringsdict / plurals systems — placeholders, plural, selectordinal, select, number, date, and time with arbitrary nesting and the # token.
Not covered: skeleton syntax beyond ::currency/USD shortcuts, spellout / ordinal rule-based number formats, and the choice type (officially deprecated).