diff --git a/core/lib/Drupal/Core/Validation/DrupalTranslator.php b/core/lib/Drupal/Core/Validation/DrupalTranslator.php
index 505decaff2ca8325d99305f94b7d90462c492d93..12b9594c4a6e017a23cf40d3fefe22f28d81d042 100644
--- a/core/lib/Drupal/Core/Validation/DrupalTranslator.php
+++ b/core/lib/Drupal/Core/Validation/DrupalTranslator.php
@@ -25,7 +25,10 @@ class DrupalTranslator implements TranslatorInterface {
   public function trans($id, array $parameters = [], $domain = NULL, $locale = NULL) {
     // If a TranslatableMarkup object is passed in as $id, return it since the
     // message has already been translated.
-    return $id instanceof TranslatableMarkup ? $id : t($id, $this->processParameters($parameters), $this->getOptions($domain, $locale));
+    if ($id instanceof TranslatableMarkup) {
+      return $id;
+    }
+    return new TranslatableMarkup($id, $this->processParameters($parameters), $this->getOptions($domain, $locale));
   }
 
   /**
@@ -67,7 +70,7 @@ public function getLocale() {
   }
 
   /**
-   * Processes the parameters array for use with t().
+   * Processes the parameters array for use with TranslatableMarkup.
    */
   protected function processParameters(array $parameters) {
     $return = [];
@@ -79,7 +82,8 @@ protected function processParameters(array $parameters) {
         $value = (string) $value;
       }
       if (is_object($value)) {
-        // t() does not work with objects being passed as replacement strings.
+        // TranslatableMarkup does not work with objects being passed as
+        // replacement strings.
       }
       // Check for symfony replacement patterns in the form "{{ name }}".
       elseif (strpos($key, '{{ ') === 0 && strrpos($key, ' }}') == strlen($key) - 3) {
@@ -95,11 +99,12 @@ protected function processParameters(array $parameters) {
   }
 
   /**
-   * Returns options suitable for use with t().
+   * Returns options suitable for use with TranslatableMarkup.
    */
   protected function getOptions($domain = NULL, $locale = NULL) {
     // We do not support domains, so we ignore this parameter.
-    // If locale is left NULL, t() will default to the interface language.
+    // If locale is left NULL, TranslatableMarkup will default to the interface
+    // language.
     $locale = isset($locale) ? $locale : $this->locale;
     return ['langcode' => $locale];
   }
diff --git a/core/tests/Drupal/Tests/Core/Plugin/Context/ContextDefinitionIsSatisfiedTest.php b/core/tests/Drupal/Tests/Core/Plugin/Context/ContextDefinitionIsSatisfiedTest.php
index 53d16ffe21877e81aa07c32bd77efcc22a3b128b..ce33d7fe54a9ce06cd670b32f6aa06f1d848f94e 100644
--- a/core/tests/Drupal/Tests/Core/Plugin/Context/ContextDefinitionIsSatisfiedTest.php
+++ b/core/tests/Drupal/Tests/Core/Plugin/Context/ContextDefinitionIsSatisfiedTest.php
@@ -342,13 +342,3 @@ public function providerTestIsSatisfiedByPassBundledEntity() {
   }
 
 }
-
-namespace Drupal\Core\Validation;
-
-if (!function_exists('t')) {
-
-  function t($string, array $args = []) {
-    return strtr($string, $args);
-  }
-
-}