Deprecated
This API is for technology preview only.
MessageFormatterIn ICU4J, the MessageFormatter class is the next iteration of com..
This new version will build on the lessons learned from using MessageFormat for 25 years
in various environments, when used directly or as a base for other public APIs.
The effort to design a succesor to MessageFormat will result in a specification
referred to as MessageFormat 2.0.
The reasoning for this effort is shared in the
“Why
MessageFormat needs a successor” document.
MessageFormat 2.0 will be more modular and easier to port and backport. It will also provide extension points via interfaces to allow users to supply new formatters and selectors without having to modify the specification. ICU will eventually include support for new formatters, such as intervals, relative time, lists, measurement units, personal names, and more, as well as the ability for users to supply their own custom implementations. These will potentially support use cases like grammatical gender, inflection, markup regimes (such as those require for text-to-speech), and other complex message management needs.
The MessageFormat Working Group, which develops the new data model, semantics, and syntax, is hosted on GitHub. The current specification for the syntax and data model can be found here.
This technical preview implements enough functions for MessageFormatter to be useful in many situations,
but the final set of functions and the parameters accepted by those functions is not yet finalized.
import static org.junit.Assert.assertEquals;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import com.ibm.icu.message2.MessageFormatter;
@Test
public void testMf2() {
final Locale enGb = Locale.forLanguageTag("en-GB");
Map arguments = new HashMap<>();
arguments.put("name", "John");
arguments.put("exp", new Date(1679971371000L)); // March 27, 2023, 7:42:51 PM
MessageFormatter mf2 = MessageFormatter.builder()
.setPattern("{Hello {$name}, your card expires on {$exp :datetime skeleton=yMMMdE}!}")
.setLocale(enGb)
.build();
assertEquals(
"Hello John, your card expires on Mon, 27 Mar 2023!",
mf2.formatToString(arguments));
}
| Code to set runtime value for placeholder | Examples of placeholder in message pattern |
|---|---|
arguments.put("name", "John") |
}$name~ |
arguments.put("exp", new Date(…)) |
}$exp :datetime skeleton=yMMMdE~ }$exp :datetime datestyle=full~ |
arguments.put("val", 3.141592653) |
}$val~ }$val :number skeleton=(.####)~ |
| No argument for fixed values known at build time | }(123456789.531) :number~ |
@Test
public void testMf2Selection() {
final String message = "match {$count :plural}\n"
+ " when one {You have one notification.}\n"
+ " when * {You have {$count} notifications.}\n";
final Locale enGb = Locale.forLanguageTag("en-GB");
Map arguments = new HashMap<>();
MessageFormatter mf2 = MessageFormatter.builder()
.setPattern(message)
.setLocale(enGb)
.build();
arguments.put("count", 1);
assertEquals(
"You have one notification.",
mf2.formatToString(arguments));
arguments.put("count", 42);
assertEquals(
"You have 42 notifications.",
mf2.formatToString(arguments));
}
The tech preview implementation comes with formatters for numbers (number),
date / time (datetime),
plural selectors (plural and selectordinal),
and general selector (select),
very similar to what MessageFormat offers.
The ICU test code
covers most features, and has examples of how to make custom placeholder formatters;
you can look for classes that implement com.ibm.icu.message2.FormatterFactory
(they are named Custom*Test.java).
These are the functions interpreted right now:
datetime |
Similar to MessageFormat's date and time. |
datestyle and timestyleSimilar to argStyle : short | medium | long | full.Same values are accepted, but we can use both in one placeholder, for example {$due :datetime datestyle=full timestyle=long}.
| |
patternSimilar to argStyle = argStyleText.This is bad i18n practice, and will probably be dropped. This is included just to support migration to MessageFormat 2. | |
skeletonSame as argStyle = argSkeletonText.These are the date/time skeletons as supported by com..
| |
number |
Similar to MessageFormat's number. |
skeletonThese are the number skeletons as supported by com.. | |
minimumFractionDigitsOnly implemented to be able to pass the unit tests from the ECMA tech preview implementation, which prefers options bags to skeletons. TBD if the final {@number } function will support skeletons, option backs, or both. | |
offsetUsed to support plural with an offset. | |
identity | Returns the direct string value of the argument (calling toString()). |
plural |
Similar to MessageFormat's plural. |
skeletonThese are the number skeletons as supported by com..Can also be indirect, from a local variable of type number (recommended). | |
offsetUsed to support plural with an offset. Can also be indirect, from a local variable of type number (recommended). | |
selectordinal |
Similar to MessageFormat's selectordinal.For now it accepts the same parameters as plural, although there is no use case for them.TBD if this will be merged into plural (with some kind option) or not. |
select | Literal match, same as MessageFormat's select. |
| Modifier and Type | Class and Description |
|---|---|
| public static class | MessageFormatter.Builder
Deprecated
This API is for technology preview only.
A Builder used to build instances of MessageFormatter.
|
| Modifier and Type | Field and Description |
|---|---|
| private final Mf2DataModel | dataModel
Deprecated
as a consequence of
Mf2DataModel being deprecated.
|
| private final Mf2FunctionRegistry | functionRegistry
Deprecated
as a consequence of
Mf2FunctionRegistry being deprecated.
|
| private final Locale | |
| private final Mf2DataModelFormatter | |
| private final String |
| Access | Constructor and Description |
|---|---|
| private | MessageFormatter(MessageFormatter.
Deprecated
as a consequence of
MessageFormatter.Builder being deprecated.
|
| Modifier and Type | Method and Description |
|---|---|
| public static MessageFormatter. | Returns: the Builder.
Deprecated
This API is for technology preview only.
Creates a builder.
|
| public FormattedMessage | Returns: theFormattedMessage class representing the message with parameters replaced.a map of objects to be formatted and substituted. arguments)
Deprecated
This API is for technology preview only.
Not yet implemented: formats a map of objects by iterating over the MessageFormat's
pattern, with the plain text “as is” and the arguments replaced by the formatted objects.
|
| public String | Returns: the string representing the message with parameters replaced.a map of objects to be formatted and substituted. arguments)
Deprecated
This API is for technology preview only.
Formats a map of objects by iterating over the MessageFormat's pattern,
with the plain text “as is” and the arguments replaced by the formatted objects.
|
| public Mf2DataModel | Returns: the data model.
Deprecated
This API is for technology preview only.
Give public access to the message data model.
|
| public Locale | Returns: the locale.
Deprecated
This API is for technology preview only.
Get the locale to use for all the formatting and selections in
the current MessageFormatter.
|
| public String | Returns: the pattern.
Deprecated
This API is for technology preview only.
Get the pattern (the serialized message in MessageFormat 2 syntax) of
the current MessageFormatter.
|
| dataModel | back to summary |
|---|---|
| private final Mf2DataModel dataModel
Deprecated as a consequence of | |
| functionRegistry | back to summary |
|---|---|
| private final Mf2FunctionRegistry functionRegistry
Deprecated as a consequence of | |
| locale | back to summary |
|---|---|
| private final Locale locale | |
| modelFormatter | back to summary |
|---|---|
| private final Mf2DataModelFormatter modelFormatter | |
| pattern | back to summary |
|---|---|
| private final String pattern | |
| MessageFormatter | back to summary |
|---|---|
| private MessageFormatter(MessageFormatter. Deprecated as a consequence of | |
| builder | back to summary |
|---|---|
| public static MessageFormatter. Deprecated This API is for technology preview only. Creates a builder.
| |
| format | back to summary |
|---|---|
| public FormattedMessage format(Map<String, Object> arguments)
Deprecated This API is for technology preview only. Not yet implemented: formats a map of objects by iterating over the MessageFormat's pattern, with the plain text “as is” and the arguments replaced by the formatted objects.
| |
| formatToString | back to summary |
|---|---|
| public String formatToString(Map<String, Object> arguments)
Deprecated This API is for technology preview only. Formats a map of objects by iterating over the MessageFormat's pattern, with the plain text “as is” and the arguments replaced by the formatted objects.
| |
| getDataModel | back to summary |
|---|---|
| public Mf2DataModel getDataModel()
Deprecated This API is for technology preview only. Give public access to the message data model. This data model is similar to the functionality we have today
in We can also imagine a model where one parses the string syntax, takes the data model,
modifies it, and then uses that modified model to create a
| |
| getLocale | back to summary |
|---|---|
| public Locale getLocale()
Deprecated This API is for technology preview only. Get the locale to use for all the formatting and selections in
the current | |
| getPattern | back to summary |
|---|---|
| public String getPattern()
Deprecated This API is for technology preview only. Get the pattern (the serialized message in MessageFormat 2 syntax) of
the current If the | |
Deprecated
This API is for technology preview only.
Builder used to build instances of MessageFormatter.
| Modifier and Type | Field and Description |
|---|---|
| private Mf2DataModel | dataModel
Deprecated
as a consequence of
Mf2DataModel being deprecated.
|
| private Mf2FunctionRegistry | functionRegistry
Deprecated
as a consequence of
Mf2FunctionRegistry being deprecated.
|
| private Locale | |
| private String |
| Access | Constructor and Description |
|---|---|
| private |
| Modifier and Type | Method and Description |
|---|---|
| public MessageFormatter | Returns: theMessageFormatter created.
Deprecated
This API is for technology preview only.
Builds an instance of MessageFormatter.
|
| public MessageFormatter. | Returns: the builder, for fluent use.the pattern to set. dataModel)
Deprecated
This API is for technology preview only.
Sets the data model used to create the message.
|
| public MessageFormatter. | Returns: the builder, for fluent use.the function registry to set. functionRegistry)
Deprecated
This API is for technology preview only.
Sets an instance of Mf2FunctionRegistry that should register any
custom functions used by the message.
|
| public MessageFormatter. | |
| public MessageFormatter. | Returns: the builder, for fluent use.the pattern to set. pattern)
Deprecated
This API is for technology preview only.
Sets the pattern (in MessageFormat 2 syntax) used to create the message.
|
| dataModel | back to summary |
|---|---|
| private Mf2DataModel dataModel
Deprecated as a consequence of | |
| functionRegistry | back to summary |
|---|---|
| private Mf2FunctionRegistry functionRegistry
Deprecated as a consequence of | |
| locale | back to summary |
|---|---|
| private Locale locale | |
| pattern | back to summary |
|---|---|
| private String pattern | |
| Builder | back to summary |
|---|---|
| private Builder() | |
| build | back to summary |
|---|---|
| public MessageFormatter build()
Deprecated This API is for technology preview only. Builds an instance of
| |
| setDataModel | back to summary |
|---|---|
| public MessageFormatter. Deprecated This API is for technology preview only. Sets the data model used to create the message.
| |
| setFunctionRegistry | back to summary |
|---|---|
| public MessageFormatter. Deprecated This API is for technology preview only. Sets an instance of There is no need to do this in order to use standard functions
(for example date / time / number formatting, plural / ordinal / literal selection).
| |
| setLocale | back to summary |
|---|---|
| public MessageFormatter. Deprecated This API is for technology preview only. Sets the locale to use for all formatting and selection operations.
| |
| setPattern | back to summary |
|---|---|
| public MessageFormatter. Deprecated This API is for technology preview only. Sets the pattern (in MessageFormat 2 syntax) used to create the message.
| |