Passing variables that contain HTML through the t() function - ! placeholder has been removed In Drupal 8, it appears that using the ! (exclamation mark) placeholder with the t() function has been removed.

I have a variable that contains HTML:

&lt;span class="fullname_wrapper"&gt;&lt;span class="first_name"&gt;John&lt;/span&gt; &lt;span class="last_name"&gt;Hancock&lt;/span&gt; &lt;span class="account_name_wrapper"&gt;(@JohnH)&lt;/span&gt;&lt;/span&gt;


I want to keep this HTML, as it will be styled specifically wherever it appears on the site.

In Drupal 7, I was able to do this:

t('Your name is !name', array('!name' =&gt; $name));


In which $name contains the HTML shown above. However, in Drupal 8, this doesn't work since the exclamation mark pass-through placeholder has been removed.

I tried this:

t('Your name is :name', array(':name' =&gt; $name));


But the HTML is still escaped.

The @ mark also escapes the HTML.

Does anyone know how HTML can be passed through the t() function in D8?

UPDATE:

According to No Sssweat's comment, it seems that my the ! mark does seem to work in t(). So here is my actual code:

drupal_set_message(
  $this-&gt;t(
    "@amount has been transferred to !account",
    array(
      '@amount' =&gt; '¥' . $form_state-&gt;getValue('amount'),
      '!account' =&gt; $this-&gt;accountService-&gt;formatAccountName($account)
    )
  )
);


And I get this error stack:

User error: Invalid placeholder (!account) in string: @amount has been transferred to !account in Drupal\Component\Render\FormattableMarkup::placeholderFormat() (line 235 of core/lib/Drupal/Component/Render/FormattableMarkup.php).

Drupal\Component\Render\FormattableMarkup::placeholderFormat('@amount has been transferred to !user', Array) (Line: 204)
Drupal\Core\StringTranslation\TranslatableMarkup-&gt;render() (Line: 15)
Drupal\Core\StringTranslation\TranslatableMarkup-&gt;__toString() (Line: 451)
drupal_set_message(Object) (Line: 128)


The user error is what made me think the ! mark is not allowed, but I must have misdiagnosed it. Does anyone know what is happening here?
It appears that any arguments passed to t() function are escaped unless they implement MarkupInterface. So that you need to represent the name as an object.

use Drupal\Component\Render\FormattableMarkup;

$formatted_name = new FormattableMarkup(
  '&lt;span class="fullname-wrapper"&gt;
    &lt;span class="first-name"&gt;@first_name&lt;/span&gt;
    &lt;span class="last-name"&gt;@second_name&lt;/span&gt;
    &lt;span class="account-name-wrapper"&gt;(@user_name)&lt;/span&gt;
   &lt;/span&gt;',
  [
    '@first_name' =&gt; 'John',
    '@second_name' =&gt; 'Hancock',
    '@user_name' =&gt; '@JohnH',
  ]
);

drupal_set_message(t('Your name is @name', ['@name' =&gt; $formatted_name]));