← All Tools

ICU MessageFormat Playground

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.

Rendered output

Syntax reference

Placeholders

Hi {name}!
Total: {amount, number, ::currency/USD}
Posted: {date, date, medium}

Simple {name} inserts a value. With a type and style: number / date / time.

Plural & selectordinal

{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…).

Select (string match)

{gender, select,
  male {his profile}
  female {her profile}
  other {their profile}}

other is required as the fallback branch.

Escaping & quoting

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.

Nesting

Sub-messages inside plural / select branches can contain other placeholders — very useful for translated UI strings with mixed values.

About this implementation

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).