Localizely logo
  • Home
  • Getting started
  • How it works
  • Pricing
  • FAQ
Sign up

I18n questions · ICU message format

Which libraries and platforms support ICU message format? 

ICU4C and ICU4J are the reference implementations, and most ecosystems have a library that covers at least the plural and select arguments. What each one supports:

  • ICU4C (icu::MessageFormat) and ICU4J (com.ibm.icu.text.MessageFormat): the complete syntax, including selectordinal, named arguments, and number and date skeletons.
  • Android: android.icu.text.MessageFormat, ICU4J's class shipped in the platform since API level 24.
  • JavaScript, FormatJS (intl-messageformat, the engine behind react-intl): plural, select and selectordinal, number skeletons, a subset of the date and time skeletons, and rich-text tags.
  • JavaScript, @messageformat/core (formerly published as messageformat): compiles plural, select and selectordinal messages into JavaScript functions, with CLDR plural data for all languages.
  • PHP: MessageFormatter in the intl extension wraps the ICU library PHP is built against; its manual shows plural, selectordinal and ::currency/CAD skeleton examples, so what works depends on that ICU version.
  • Dart and Flutter: the intl package (Intl.plural, Intl.select) and ARB files processed by Flutter's gen_l10n use the plural and select syntax, with other required and case-sensitive select matching.
  • Angular: the built-in i18n supports ICU expressions in templates, {minutes, plural, =0 {just now} =1 {one minute ago} other {{{minutes}} minutes ago}} and select, and they can be nested.
  • Java, java.text.MessageFormat: only partially. Its argument types are number, date, time and choice; ChoiceFormat selects by numeric range without locale plural rules, and every apostrophe starts a quote. Use ICU4J for real plurals.
  • iOS and macOS: no built-in ICU MessageFormat. Plurals go through String Catalogs (Xcode 15 and later) or .stringsdict files, which store one string per CLDR category behind a %#@variable@ placeholder instead of a plural argument inside the message.

Implementations differ most in two places: whether an apostrophe starts a quote, explained in How do I escape braces and apostrophes in ICU message format?, and which skeletons they accept. Test messages in the target library, or in the ICU message editor for the reference ICU behaviour.

Published Oct 9, 2026 · Markdown version

Related ICU message format questions:

ICU message format guide:

Read the quick guide to ICU message format
Localizely logo
About
Free tools
Boring stuff
  • Privacy Policy
  • Terms of Service
  • Cookie Policy
  • Compare
Newsletter
Copyrights 2026 © Localizely