Drupal 8では、!(感嘆符)t()関数を含むプレースホルダーは削除されました。
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>
このHTMLは、サイトのどこにでも表示されるように特別にスタイル設定されるので、保持しておきます。
Drupal 7では、これを行うことができました。
t('Your name is !name', array('!name' => $name));
$ nameには、上記のHTMLが含まれています。ただし、Drupal 8では、感嘆符のパススループレースホルダーが削除されているため、これは機能しません。
私はこれを試しました:
t('Your name is :name', array(':name' => $name));
しかし、HTMLはまだエスケープされています。
@マークもHTMLをエスケープします。
D8のt()関数を介してHTMLを渡す方法を知っている人はいますか?
更新:
No Sssweatのコメントによると、私の!markはt()で機能するようです。だからここに私の実際のコードがあります:
drupal_set_message(
$this->t(
"@amount has been transferred to !account",
array(
'@amount' => '¥' . $form_state->getValue('amount'),
'!account' => $this->accountService->formatAccountName($account)
)
)
);
そして、私はこのエラースタックを取得します:
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)
ユーザーエラーは私が考えさせたものです!マークは許可されていませんが、誤診したに違いありません。ここで何が起こっているのか誰か知っていますか?
'!account' => '<b>test</b>'
テスト目的で使用してみてください。それでもエラーが発生するかどうかを確認します。原因はおそらく$this->accountService->formatAccountName($account)
有効なコードではありません。また、私の上のノートのテストメッセージは、私が使用していない$this->t(
$test = "<b>test</b>"; drupal_set_message(t('Something !var just happened.', array('!var' => $test)), 'warning');
警告メッセージが表示され、単語test
は太字になりエスケープされません。したがって、!
D8 ではを使用しても問題なく動作するようです。