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:
<span class="fullname_wrapper"><span class="first_name">John</span> <span class="last_name">Hancock</span> <span class="account_name_wrapper">(@JohnH)</span></span>
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' => $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' => $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?
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->t( "@amount has been transferred to !account", array( '@amount' => '¥' . $form_state->getValue('amount'), '!account' => $this->accountService->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->render() (Line: 15) Drupal\Core\StringTranslation\TranslatableMarkup->__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?
$test = "<b>test</b>"; drupal_set_message(t('Something !var just happened.', array('!var' => $test)), 'warning');I get the warning message, the word
testgets bolded and not escaped. Therefore, using
!seems to work fine in D8.
'!account' => '<b>test</b>'for testing purposes. See if you still get that error. Cause perhaps
$this->accountService->formatAccountName($account)is not a valid code. Also, note on my testing message, I do not use