Implements the ICU Message Format with functions to parse and interpolate messages.
Supports both ICU Message Format v1 and Message Format 2.
Version detection is automatic: messages starting with . (.input,
.local, .match) or {{ are treated as MF2; everything else is v1.
An explicit :version option (:v1 or :v2) overrides detection.
Summary
Functions
Extract the binding names from an ICU message.
Formats a message into a canonical form.
Formats a message into a canonical form or raises if the message cannot be parsed.
Detects whether a message string is MF2 (:v2) or legacy ICU (:v1).
Format a message in the ICU Message Format into a string.
Formats a message and returns the result or raises on error.
Format a message in the ICU Message Format into an iolist.
Returns the Jaro distance between two messages.
Returns the Jaro distance between two messages or raises.
Returns the translation of the given ICU-formatted message string.
Returns the translation of the given ICU-formatted message string.
Types
Functions
Extract the binding names from an ICU message.
Arguments
messageis a CLDR message in binary or parsed form.
Returns
A list of binding names as strings or
{:error, {exception, reason}}
Examples
iex> Cldr.Message.bindings "This {variable} is in the message"
["variable"]
@spec canonical_message(String.t(), Keyword.t()) :: {:ok, String.t()} | {:error, {module(), String.t()}}
Formats a message into a canonical form.
This allows for messages to be compared
directly, or using Cldr.Message.jaro_distance/3.
Arguments
messageis a CLDR message in binary form.optionsis a keyword list of options. The default is[].
Options
:trimdetermines if the message is trimmed of whitespace before formatting. The default istrue.:prettydetermines if the message if formatted with indentation to aid readability. The default isfalse.
Returns
{ok, canonical_message}wherecanonical_messageis a string or{:error, {exception, reason}}
Examples
iex> Cldr.Message.canonical_message "{greeting } to you!"
{:ok, "{greeting} to you!"}
Formats a message into a canonical form or raises if the message cannot be parsed.
This allows for messages to be compared
directly, or using Cldr.Message.jaro_distance/3.
Arguments
messageis a CLDR message in binary form.optionsis a keyword list of options. The default is[].
Options
:trimdetermines if the message is trimmed of whitespace before formatting. The default istrue.:prettydetermines if the message if formatted with indentation to aid readability. The default isfalse.
Returns
canonical_messageas a string orraises an exception
Examples
iex> Cldr.Message.canonical_message! "{greeting } to you!"
"{greeting} to you!"
@spec detect_version(String.t()) :: :v1 | :v2
Detects whether a message string is MF2 (:v2) or legacy ICU (:v1).
MF2 messages start with . (declarations/matcher) or {{ (quoted pattern).
Arguments
messageis an ICU message string.
Returns
:v1if the message is a legacy ICU Message Format string.:v2if the message is an MF2 message.
Examples
iex> Cldr.Message.detect_version("Hello {name}")
:v1
iex> Cldr.Message.detect_version("{{Hello, world!}}")
:v2
iex> Cldr.Message.detect_version(".input {$count :number}\n.match $count\n 1 {{one}}\n * {{other}}")
:v2
@spec format(String.t(), bindings(), options()) :: {:ok, String.t()} | {:error, {module(), String.t()}}
Format a message in the ICU Message Format into a string.
The ICU Message Format uses message "pattern" strings with
variable-element placeholders enclosed in {curly braces}. The
argument syntax can include formatting details, otherwise a
default format is used.
Arguments
bindingsis a list or map of arguments that are used to replace placeholders in the message.optionsis a keyword list of options.
Options
backendis anyCldrbackend. That is, any module that containsuse Cldr.:localeis any valid locale name returned byCldr.known_locale_names/0or at:Cldr.LanguageTagstruct. The default isCldr.get_locale/0.:trimdetermines if the message is trimmed of whitespace before formatting. The default isfalse.:allow_positional_argsdetermines if position arguments are permitted. Positional arguments are in the format{0}in the message. The default istrue.:formatter_backenddetermines which formatting engine to use for MF2 (v2) messages. Accepts:default,:nif, or:elixir. When set to:default, the ICU NIF is used if available, otherwise the pure-Elixir interpreter is used. When set to:nif, the NIF is required and aRuntimeErroris raised if it is not available. When set to:elixir, the pure-Elixir interpreter is always used. The default is:default. This option has no effect on v1 messages.All other options are passed to the
to_string/2function of a formatting module.
Returns
{:ok, formatted_message}or{:error, {module, reason}}
Examples
iex> Cldr.Message.format "{greeting} to you!", greeting: "Good morning"
{:ok, "Good morning to you!"}
Formats a message and returns the result or raises on error.
Same as format/3 but returns the formatted string directly
or raises an exception.
Examples
iex> Cldr.Message.format! "{greeting} to you!", greeting: "Good morning"
"Good morning to you!"
iex> Cldr.Message.format! "{{Hello, world!}}"
"Hello, world!"
@spec format_to_iolist(String.t(), bindings(), options()) :: {:ok, list(), list(), list()} | {:error, list(), list(), list()} | {:error, {module(), binary()}}
Format a message in the ICU Message Format into an iolist.
The ICU Message Format uses message "pattern" strings with
variable-element placeholders enclosed in {curly braces}. The
argument syntax can include formatting details, otherwise a
default format is used.
Arguments
bindingsis a list or map of arguments that are used to replace placeholders in the message.optionsis a keyword list of options.
Options
backendis anyCldrbackend. That is, any module that containsuse Cldr.:localeis any valid locale name returned byCldr.known_locale_names/0or at:Cldr.LanguageTagstruct. The default isCldr.get_locale/0.:trimdetermines if the message is trimmed of whitespace before formatting. The default isfalse.:allow_positional_argsdetermines if position arguments are permitted. Positional arguments are in the format{0}in the message. The default istrue.All other options are passed to the
to_string/2function of a formatting module.
Returns
{:ok, formatted_message}or{:error, {module, reason}}
Examples
iex> Cldr.Message.format_to_iolist "{greeting} to you!", greeting: "Good morning"
{:ok, ["Good morning", " to you!"], ["greeting"], []}
@spec jaro_distance(String.t(), String.t(), Keyword.t()) :: {:ok, float()} | {:error, {module(), String.t()}}
Returns the Jaro distance between two messages.
This allows for fuzzy matching of message which can be helpful when a message string is changed but the semantics remain the same.
Arguments
message1is a CLDR message in binary form.message2is a CLDR message in binary form.optionsis a keyword list of options. The default is[].
Options
:trimdetermines if the message is trimmed of whitespace before formatting. The default isfalse.
Returns
{ok, distance}wheredistanceis a float value between 0.0 (equates to no similarity) and 1.0 (is an exact match) representing Jaro distance betweenmessage1andmessage2or{:error, {exception, reason}}
Examples
iex> Cldr.Message.jaro_distance "{greetings} to you!", "{greeting} to you!"
{:ok, 0.9824561403508771}
Returns the Jaro distance between two messages or raises.
This allows for fuzzy matching of message which can be helpful when a message string is changed but the semantics remain the same.
Arguments
message1is a CLDR message in binary form.message2is a CLDR message in binary form.optionsis a keyword list of options. The default is[].
Options
:trimdetermines if the message is trimmed of whitespace before formatting. The default isfalse.
Returns
distancewheredistanceis a float value between 0.0 (equates to no similarity) and 1.0 (is an exact match) representing Jaro distance betweenmessage1andmessage2orraises an exception
Examples
iex> Cldr.Message.jaro_distance! "{greetings} to you!", "{greeting} to you!"
0.9824561403508771
Returns the translation of the given ICU-formatted message string.
Any placeholders are replaced with the value of variables already in scope at the time of compilation.
t/1 is a wrapper around the gettext/2 macro
which should therefore be imported from a Gettext
backend prior to calling t/1.
Arguments
messageis an ICU format message string.
Returns
- A translated string.
Examples
import MyApp.Gettext
Cldr.Message.t("{greeting} to you!")
Returns the translation of the given ICU-formatted message string.
t/2 is a wrapper around the gettext/2 macro
which should therefore be imported from a Gettext
backend prior to calling t/2.
Arguments
messageis an ICU format message string.bindingsis a keyword list or map of bindings used to replace placeholders in the message.
Returns
- A translated string.
Examples
import MyApp.Gettext
Cldr.Message.t("{greeting} to you!", greeting: "Good morning")