Dans Drupal 8, il semble que l'utilisation de l'espace réservé! (Point d'exclamation) avec la fonction t() a été supprimée).
J'ai une variable qui contient du 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>
Je souhaite conserver ce code HTML, car il sera stylisé spécifiquement partout où il apparaît sur le site.
Dans Drupal 7, j'ai pu faire ceci:
t('Your name is !name', array('!name' => $name));
Dans lequel $ name contient le code HTML indiqué ci-dessus. Cependant, dans Drupal 8, cela ne fonctionne pas car l'espace réservé de passage pour le point d'exclamation a été supprimé.
J'ai essayé ceci:
t('Your name is :name', array(':name' => $name));
Mais le HTML est toujours échappé.
La marque @ échappe également au HTML.
Est-ce que quelqu'un sait comment HTML peut être transmis via la fonction t() dans D8?
MISE À JOUR:
Selon le commentaire de No Sssweat, il semble que mon le! mark semble fonctionner dans t (). Voici donc mon code actuel:
drupal_set_message(
$this->t(
"@amount has been transferred to !account",
array(
'@amount' => '¥' . $form_state->getValue('amount'),
'!account' => $this->accountService->formatAccountName($account)
)
)
);
Et je reçois cette pile d'erreur:
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)
L'erreur utilisateur est ce qui m'a fait penser au! marque n'est pas autorisée, mais je dois avoir mal diagnostiqué. Quelqu'un sait-il ce qui se passe ici?
Il semble que tous les arguments passés à t() fonction sont échappés sauf s'ils implémentent MarkupInterface. De sorte que vous devez représenter le nom en tant qu'objet.
use Drupal\Component\Render\FormattableMarkup;
$formatted_name = new FormattableMarkup(
'<span class="fullname-wrapper">
<span class="first-name">@first_name</span>
<span class="last-name">@second_name</span>
<span class="account-name-wrapper">(@user_name)</span>
</span>',
[
'@first_name' => 'John',
'@second_name' => 'Hancock',
'@user_name' => '@JohnH',
]
);
drupal_set_message(t('Your name is @name', ['@name' => $formatted_name]));
Oui, l'erreur utilisateur que vous voyez signifie que l'espace réservé que vous utilisez n'est pas reconnu à partir de t()
. FormattableMarkup::placeholderFormat()
, la méthode qui fait le travail derrière la scène, ne reconnaît que 3 types d'espace réservé: @ variable , % variable , et : variable . Si l'espace réservé commence par un caractère différent, il exécute le code suivant, ce qui provoque le comportement que vous voyez.
default:
// We do not trigger an error for placeholder that start with an
// alphabetic character.
// @todo https://www.drupal.org/node/2807743 Change to an exception
// and always throw regardless of the first character.
if (!ctype_alpha($key[0])) {
// We trigger an error as we may want to introduce new placeholders
// in the future without breaking backward compatibility.
trigger_error('Invalid placeholder (' . $key . ') in string: ' . $string, E_USER_ERROR);
}
elseif (strpos($string, $key) !== FALSE) {
trigger_error('Invalid placeholder (' . $key . ') in string: ' . $string, E_USER_DEPRECATED);
}
// No replacement possible therefore we can discard the argument.
unset($args[$key]);
break;
La description de @ variable indique que la valeur de la variable pourrait être:
Dans votre cas, j'utiliserais simplement le code suivant.
use Drupal\Component\Render\FormattableMarkup;
drupal_set_message(
$this->t(
"@amount has been transferred to @account",
[
'@amount' => '¥' . $form_state->getValue('amount'),
'@account' => new FormattableMarkup($this->accountService->formatAccountName($account), [])
]
)
);