function declareIcuTemplate(templateString, options) {
  // The options are only really used by the compiler when extracting messages
  // into an XMB file for translation. However, we'll check for errors now,
  // in order to help the developer discover they've made a mistake ASAP.
  // Compilation will completely replace calls to this method with static
  // strings, so the cost of these checks will only be paid during testing
  // and development.
  assertDeclareIcuTemplateParametersAreValid(templateString, options);
  return templateString;
}
Declare a message template using ICU format.

See https://unicode-org.github.io/icu/userguide/format_parse/messages/

When run uncompiled, the template string and options will be checked for
easy-to-spot programming errors. If there are none, the template string will
be returned unmodified. Otherwise, an exception will be thrown.

The template string will probably contain ICU-formatted placeholders
(e.g. "Hi, {NAME}"). The return value from this function will still contain
those. It should be passed to a message formatting API, such as
`goog.i18n.MessageFormat` in order to specify the runtime values to
substitute and produce the final message to display to users.

IMPORTANT: It is an error to use closure-style placeholder syntax
(e.g. "Hi, {$NAME}" - note the '{$'), such as is used by `goog.getMsg()` for
compile-time substitution of placeholder values.

At compile time, closure-compiler will look up the localized form of this
message in a translation bundle file (XTB), and replace this function call
with a string literal containing the translated template.

The XTB file is generated by some combination of human translators and
automated tools based on information they receive in an XMB file.

The closure-compiler message extraction tool will generate an XMB file
from messages declared in JS source code, including calls to this function.

The message element produced for a call to this function will contain a
`<ph>` (placeholder) element for each ICU placeholder found in the template
string.

e.g.

```javascript
const MSG_HI = declareIcuTemplate(
    'Hi, {START_BOLD}{NAME}{END_BOLD}!',
    {
      description: 'Say "Hi" to the user.',
      example: {
        'NAME': 'Jane'
      },
      original_code: {
        // Shown to make clear how it appears in the XMB file.
        // Hand-written JS code should not use this.
        'NAME': 'user.getName()'
      }
    });
```

May generate an XMB element like this:

```xml
<msg
    id='3346156045081344548'
    name='MSG_HI'
    desc='Say "Hi" to the user.'
    >Hi, {START_BOLD}<ph
name="NAME"><ex>Jane</ex>user.getName()</ph>{END_BOLD}!</msg>
```

IMPORTANT: The options argument and the values it contains must all be
literal values. The message extraction tool is not able to evaluate
expressions or look up variable values.

Note that in the example above there are ICU placeholders that are not
converted into `<ph>` placeholder elements in the XMB file. When no example
or original code text is given, there is no need to create such elements.
When only one of these two values is given, the other will default to "-"
for historical reasons.


The "original_code" option is intended for use when automatically generating
JS code from some other source, such as an Angular template, where it is
difficult or impossible for the human author to specify a meaningful
placeholder name. Hand-written JS code should just use a meaningful
placeholder name instead.

The 'original_code' text and the 'example' text are shown to human
translators to give them more context about the meaning of the message.
They are not used in any other way by closure-compiler or closure-library.

@param {string} templateString
@param {!IcuTemplateOptions} options
@return {string}