diff --git a/core/lib/Drupal/Core/StringTranslation/TranslatableString.php b/core/lib/Drupal/Core/StringTranslation/TranslatableString.php
index 0dbb3a6..fb28040 100644
--- a/core/lib/Drupal/Core/StringTranslation/TranslatableString.php
+++ b/core/lib/Drupal/Core/StringTranslation/TranslatableString.php
@@ -83,6 +83,7 @@ class TranslatableString implements SafeStringInterface {
    * @see \Drupal\Component\Utility\PlaceholderTrait::placeholderFormat()
    */
   public function __construct($string, array $arguments = array(), array $options = array(), TranslationInterface $string_translation = NULL) {
+    assert(is_string($string), '$string ("' . (string) $string . '") must be a string.');
     $this->string = $string;
     $this->arguments = $arguments;
     $this->options = $options;
diff --git a/core/lib/Drupal/Core/Validation/DrupalTranslator.php b/core/lib/Drupal/Core/Validation/DrupalTranslator.php
index 4318f9d..9406fae 100644
--- a/core/lib/Drupal/Core/Validation/DrupalTranslator.php
+++ b/core/lib/Drupal/Core/Validation/DrupalTranslator.php
@@ -8,6 +8,7 @@
 namespace Drupal\Core\Validation;
 
 use Drupal\Component\Utility\SafeStringInterface;
+use Drupal\Core\StringTranslation\TranslatableString;
 
 /**
  * Translates strings using Drupal's translation system.
@@ -27,8 +28,9 @@ class DrupalTranslator implements TranslatorInterface {
    * Implements \Symfony\Component\Translation\TranslatorInterface::trans().
    */
   public function trans($id, array $parameters = array(), $domain = NULL, $locale = NULL) {
-
-    return t($id, $this->processParameters($parameters), $this->getOptions($domain, $locale));
+    // If a TranslatableString object is passed in as $id, return it since the
+    // message has already been translated.
+    return $id instanceof TranslatableString ? $id : t($id, $this->processParameters($parameters), $this->getOptions($domain, $locale));
   }
 
   /**
diff --git a/core/modules/system/tests/modules/module_test/module_test.module b/core/modules/system/tests/modules/module_test/module_test.module
index cead329..ff7af57 100644
--- a/core/modules/system/tests/modules/module_test/module_test.module
+++ b/core/modules/system/tests/modules/module_test/module_test.module
@@ -47,7 +47,7 @@ function module_test_system_info_alter(&$info, Extension $file, $type) {
     }
   }
   if ($file->getName() == 'seven' && $type == 'theme') {
-    $info['regions']['test_region'] = t('Test region');
+    $info['regions']['test_region'] = 'Test region';
   }
 }
 
diff --git a/core/tests/Drupal/Tests/Core/StringTranslation/TranslatableStringTest.php b/core/tests/Drupal/Tests/Core/StringTranslation/TranslatableStringTest.php
index 862a78a..46e7fd3 100644
--- a/core/tests/Drupal/Tests/Core/StringTranslation/TranslatableStringTest.php
+++ b/core/tests/Drupal/Tests/Core/StringTranslation/TranslatableStringTest.php
@@ -85,4 +85,12 @@ public function testToString() {
     $this->assertRegExp('/Exception thrown while calling __toString on a .*Mock_TranslatableString_.* object in .*TranslatableStringTest.php on line [0-9]+: Yes you may./', $this->lastErrorMessage);
   }
 
+  /**
+   * @expectedException \AssertionError
+   * @expectedExceptionMessage $string ("foo") must be a string.
+   */
+  public function testIsStringAssertion() {
+    $translation = $this->getStringTranslationStub();
+    new TranslatableString(new TranslatableString('foo', [], [], $translation));
+  }
 }
