In Drupal 8 scheint es, dass mit dem! Platzhalter (Ausrufezeichen) mit der Funktion t () wurde entfernt.
Ich habe eine Variable, die HTML enthält:
<span class="fullname_wrapper"><span class="first_name">John</span> <span class="last_name">Hancock</span> <span class="account_name_wrapper">(@JohnH)</span></span>
Ich möchte diesen HTML-Code beibehalten, da er speziell dort gestaltet wird, wo er auf der Website angezeigt wird.
In Drupal 7 konnte ich Folgendes tun:
t('Your name is !name', array('!name' => $name));
In dem $ name den oben gezeigten HTML-Code enthält. In Drupal 8 funktioniert dies jedoch nicht, da der Platzhalter für das Ausrufezeichen entfernt wurde.
Ich habe es versucht:
t('Your name is :name', array(':name' => $name));
Der HTML-Code ist jedoch weiterhin maskiert.
Das @ -Zeichen entgeht auch dem HTML-Code.
Weiß jemand, wie HTML über die Funktion t () in D8 übergeben werden kann?
AKTUALISIEREN:
Laut No Sssweats Kommentar scheint es, dass mein! mark scheint in t () zu funktionieren. Also hier ist mein aktueller Code:
drupal_set_message(
$this->t(
"@amount has been transferred to !account",
array(
'@amount' => '¥' . $form_state->getValue('amount'),
'!account' => $this->accountService->formatAccountName($account)
)
)
);
Und ich bekomme diesen Fehlerstapel:
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)
Der Benutzerfehler hat mich zum Nachdenken gebracht! Mark ist nicht erlaubt, aber ich muss es falsch diagnostiziert haben. Weiß jemand, was hier passiert?
$test = "<b>test</b>"; drupal_set_message(t('Something !var just happened.', array('!var' => $test)), 'warning');
die Warnmeldungtest
angezeigt , das Wort wird fett gedruckt und nicht maskiert. Daher!
scheint die Verwendung in D8 gut zu funktionieren.'!account' => '<b>test</b>'
zu Testzwecken. Überprüfen Sie, ob dieser Fehler weiterhin angezeigt wird. Ursache ist vielleicht$this->accountService->formatAccountName($account)
kein gültiger Code. Beachten Sie auch, auf meinem Test Nachricht , ich nicht verwenden$this->t(
Antworten:
Es scheint, dass alle an die Funktion t () übergebenen Argumente maskiert werden, es sei denn, sie implementieren MarkupInterface . Damit müssen Sie den Namen als Objekt darstellen.
quelle
'@amount has been transferred to @account'
was eine normale Zeichenfolge mit Platzhaltern ist. Sie verwenden nichtt()
wie in$amount . t(' has been transferred to ') . $account
. Das ist schlechte Praxis.Ja, der angezeigte Benutzerfehler bedeutet, dass der von Ihnen verwendete Platzhalter nicht erkannt wird
t()
.FormattableMarkup::placeholderFormat()
Die Methode, die die Arbeit hinter den Kulissen erledigt , erkennt nur drei Platzhaltertypen: @ variable , % variable und : variable . Wenn der Platzhalter mit einem anderen Zeichen beginnt, führt er den folgenden Code aus, der das angezeigte Verhalten verursacht.Die Beschreibung für @variable besagt, dass der Wert der Variablen sein könnte:
In Ihrem Fall würde ich nur den folgenden Code verwenden.
quelle