it-swarm.com.de

Das Übergeben von Variablen, die HTML enthalten, über die Funktion t() - - - Platzhalter wurde entfernt

In Drupal 8) wurde anscheinend der Platzhalter! (Ausrufezeichen) mit der Funktion t()) 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 Pass-Through-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?

9
Jaypan

Es scheint, dass alle Argumente, die an t() function - übergeben werden , es sei denn, sie implementieren MarkupInterface . Damit müssen Sie den Namen als Objekt darstellen.

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]));
22
ya.teck

Ja, der angezeigte Benutzerfehler bedeutet, dass der von Ihnen verwendete Platzhalter von t() nicht erkannt wird. FormattableMarkup::placeholderFormat() , die Methode, die die Arbeit hinter den Kulissen erledigt, erkennt nur 3 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.

  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;

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.

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), [])
    ]
  )
);
5
kiamlaluno