diff --git a/core/modules/locale/locale.bulk.inc b/core/modules/locale/locale.bulk.inc
index 43c0d6c..506516c 100644
--- a/core/modules/locale/locale.bulk.inc
+++ b/core/modules/locale/locale.bulk.inc
@@ -220,7 +220,7 @@ function locale_translate_batch_import($file, array $options, array &$context) {
         // https://www.drupal.org/node/1089472.
         $context['finished'] = min(0.95, $report['seek'] / filesize($file->uri));
         if (isset($options['message'])) {
-          $context['message'] = t('!message (@percent%).', array('!message' => $options['message'], '@percent' => (int) ($context['finished'] * 100)));
+          $context['message'] = t('@message (@percent%).', array('@message' => $options['message'], '@percent' => (int) ($context['finished'] * 100)));
         }
         else {
           $context['message'] = t('Importing translation file: %filename (@percent%).', array('%filename' => $file->filename, '@percent' => (int) ($context['finished'] * 100)));
diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module
index 99b7e34..25e8fe9 100644
--- a/core/modules/locale/locale.module
+++ b/core/modules/locale/locale.module
@@ -149,28 +149,28 @@ function locale_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.locale':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Interface Translation module allows you to translate interface text (<em>strings</em>) into different languages, and to switch between them for the display of interface text. It uses the functionality provided by the <a href="!language">Language module</a>. For more information, see the <a href="!doc-url">online documentation for the Interface Translation module</a>.', array('!doc-url' => 'https://www.drupal.org/documentation/modules/locale/', '!language' => \Drupal::url('help.page', array('name' => 'language')))) . '</p>';
+      $output .= '<p>' . t('The Interface Translation module allows you to translate interface text (<em>strings</em>) into different languages, and to switch between them for the display of interface text. It uses the functionality provided by the <a href="@language">Language module</a>. For more information, see the <a href="@doc-url">online documentation for the Interface Translation module</a>.', array('@doc-url' => 'https://www.drupal.org/documentation/modules/locale/', '@language' => \Drupal::url('help.page', array('name' => 'language')))) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Importing translation files') . '</dt>';
-      $output .= '<dd>' . t('Translation files with translated interface text are imported automatically when languages are added on the <a href="!languages">Languages</a> page, or when modules or themes are enabled. On the <a href="!locale-settings">Settings</a> page, the <em>Translation source</em> can be restricted to local files only, or to include the <a href="!server">Drupal translation server</a>. Although modules and themes may not be fully translated in all languages, new translations become available frequently. You can specify whether and how often to check for translation file updates and whether to overwrite existing translations on the <a href="!locale-settings">Settings</a> page. You can also manually import a translation file on the <a title="User interface translation import" href="!import">Import</a> page.', array('!import' => \Drupal::url('locale.translate_import'), '!locale-settings' => \Drupal::url('locale.settings'), '!languages' => \Drupal::url('entity.configurable_language.collection'), '!server' => 'https://localize.drupal.org')) . '</dd>';
+      $output .= '<dd>' . t('Translation files with translated interface text are imported automatically when languages are added on the <a href="@languages">Languages</a> page, or when modules or themes are enabled. On the <a href="@locale-settings">Settings</a> page, the <em>Translation source</em> can be restricted to local files only, or to include the <a href="@@server">Drupal translation server</a>. Although modules and themes may not be fully translated in all languages, new translations become available frequently. You can specify whether and how often to check for translation file updates and whether to overwrite existing translations on the <a href="@locale-settings">Settings</a> page. You can also manually import a translation file on the <a title="User interface translation import" href="@import">Import</a> page.', array('@import' => \Drupal::url('locale.translate_import'), '@locale-settings' => \Drupal::url('locale.settings'), '@languages' => \Drupal::url('entity.configurable_language.collection'), '@server' => 'https://localize.drupal.org')) . '</dd>';
       $output .= '<dt>' . t('Checking the translation status') . '</dt>';
-      $output .= '<dd>' . t('You can check how much of the interface on your site is translated into which language on the <a href="!languages">Languages</a> page. On the <a href="!translation-updates">Available translation updates</a> page, you can check whether interface translation updates are available on the <a href="!server">Drupal translation server</a>.', array('!languages' => \Drupal::url('entity.configurable_language.collection'), '!translation-updates' => \Drupal::url('locale.translate_status'), '!server' => 'https://localize.drupal.org')) . '<dd>';
+      $output .= '<dd>' . t('You can check how much of the interface on your site is translated into which language on the <a href="@languages">Languages</a> page. On the <a href="@translation-updates">Available translation updates</a> page, you can check whether interface translation updates are available on the <a href="@server">Drupal translation server</a>.', array('@languages' => \Drupal::url('entity.configurable_language.collection'), '@translation-updates' => \Drupal::url('locale.translate_status'), '@server' => 'https://localize.drupal.org')) . '<dd>';
       $output .= '<dt>' . t('Translating individual strings') . '</dt>';
-      $output .= '<dd>' . t('You can translate individual strings directly on the <a href="!translate">User interface translation</a> page, or download the currently-used translation file for a specific language on the <a title="User interface translation export" href="!export">Export</a> page. Once you have edited the translation file, you can then import it again on the <a title="User interface translation import" href="!import">Import</a> page.', array('!translate' => \Drupal::url('locale.translate_page'), '!export' => \Drupal::url('locale.translate_export'), '!import' => \Drupal::url('locale.translate_import'))) . '</dd>';
+      $output .= '<dd>' . t('You can translate individual strings directly on the <a href="@translate">User interface translation</a> page, or download the currently-used translation file for a specific language on the <a title="User interface translation export" href="@export">Export</a> page. Once you have edited the translation file, you can then import it again on the <a title="User interface translation import" href="@import">Import</a> page.', array('@translate' => \Drupal::url('locale.translate_page'), '@export' => \Drupal::url('locale.translate_export'), '@import' => \Drupal::url('locale.translate_import'))) . '</dd>';
       $output .= '</dl>';
       return $output;
 
     case 'entity.configurable_language.collection':
-      return '<p>' . t('Interface translations are automatically imported when a language is added, or when new modules or themes are enabled. The report <a href="!update">Available translation updates</a> shows the status. Interface text can be customized in the <a href="!translate">user interface translation</a> page.', array('!update' => \Drupal::url('locale.translate_status'), '!translate' => \Drupal::url('locale.translate_page'))) . '</p>';
+      return '<p>' . t('Interface translations are automatically imported when a language is added, or when new modules or themes are enabled. The report <a href="@update">Available translation updates</a> shows the status. Interface text can be customized in the <a href="@translate">user interface translation</a> page.', array('@update' => \Drupal::url('locale.translate_status'), '@translate' => \Drupal::url('locale.translate_page'))) . '</p>';
 
     case 'locale.translate_page':
-      $output = '<p>' . t('This page allows a translator to search for specific translated and untranslated strings, and is used when creating or editing translations. (Note: Because translation tasks involve many strings, it may be more convenient to <a title="User interface translation export" href="!export">export</a> strings for offline editing in a desktop Gettext translation editor.) Searches may be limited to strings in a specific language.', array('!export' => \Drupal::url('locale.translate_export'))) . '</p>';
+      $output = '<p>' . t('This page allows a translator to search for specific translated and untranslated strings, and is used when creating or editing translations. (Note: Because translation tasks involve many strings, it may be more convenient to <a title="User interface translation export" href="@export">export</a> strings for offline editing in a desktop Gettext translation editor.) Searches may be limited to strings in a specific language.', array('@export' => \Drupal::url('locale.translate_export'))) . '</p>';
       return $output;
 
     case 'locale.translate_import':
-      $output = '<p>' . t('Translation files are automatically downloaded and imported when <a title="Languages" href="!language">languages</a> are added, or when modules or themes are enabled.', array('!language' => \Drupal::url('entity.configurable_language.collection'))) . '</p>';
-      $output .= '<p>' . t('This page allows translators to manually import translated strings contained in a Gettext Portable Object (.po) file. Manual import may be used for customized translations or for the translation of custom modules and themes. To customize translations you can download a translation file from the <a href="!url">Drupal translation server</a> or <a title="User interface translation export" href="!export">export</a> translations from the site, customize the translations using a Gettext translation editor, and import the result using this page.', array('!url' => 'https://localize.drupal.org', '!export' => \Drupal::url('locale.translate_export'))) . '</p>';
+      $output = '<p>' . t('Translation files are automatically downloaded and imported when <a title="Languages" href="@language">languages</a> are added, or when modules or themes are enabled.', array('@language' => \Drupal::url('entity.configurable_language.collection'))) . '</p>';
+      $output .= '<p>' . t('This page allows translators to manually import translated strings contained in a Gettext Portable Object (.po) file. Manual import may be used for customized translations or for the translation of custom modules and themes. To customize translations you can download a translation file from the <a href="@url">Drupal translation server</a> or <a title="User interface translation export" href="@export">export</a> translations from the site, customize the translations using a Gettext translation editor, and import the result using this page.', array('@url' => 'https://localize.drupal.org', '@export' => \Drupal::url('locale.translate_export'))) . '</p>';
       $output .= '<p>' . t('Note that importing large .po files may take several minutes.') . '</p>';
       return $output;
 
diff --git a/core/modules/locale/locale.pages.inc b/core/modules/locale/locale.pages.inc
index d58d955..c1b61c6 100644
--- a/core/modules/locale/locale.pages.inc
+++ b/core/modules/locale/locale.pages.inc
@@ -80,10 +80,10 @@ function template_preprocess_locale_translation_update_info(array &$variables) {
     if ($variables['not_found']) {
       foreach ($variables['not_found'] as $update) {
         $version = $update['version'] ? $update['version'] : t('no version');
-        $releases[] = SafeMarkup::format('@module (@version). !info', array(
+        $releases[] = SafeMarkup::format('@module (@version). @info', array(
           '@module' => $update['name'],
           '@version' => $version,
-          '!info' => $update['info'],
+          '@info' => $update['info'],
         ));
       }
     }
diff --git a/core/modules/locale/src/Tests/LocaleJavascriptTranslationTest.php b/core/modules/locale/src/Tests/LocaleJavascriptTranslationTest.php
index 1436527..3ba4858 100644
--- a/core/modules/locale/src/Tests/LocaleJavascriptTranslationTest.php
+++ b/core/modules/locale/src/Tests/LocaleJavascriptTranslationTest.php
@@ -58,7 +58,7 @@ public function testFileParsing() {
       "Double Quote \\\"Escaped\\\" t" => '',
       'Double Quote Concat strings t' => '',
 
-      'Context !key Args t' => 'Context string',
+      'Context @key Args t' => 'Context string',
 
       'Context Unquoted t' => 'Context string unquoted',
       'Context Single Quoted t' => 'Context string single quoted',
@@ -73,7 +73,7 @@ public function testFileParsing() {
       "Double Quote plural{$etx}Double Quote @count plural" => '',
       "Double Quote \\\"Escaped\\\" plural{$etx}Double Quote \\\"Escaped\\\" @count plural" => '',
 
-      "Context !key Args plural{$etx}Context !key Args @count plural" => 'Context string',
+      "Context @key Args plural{$etx}Context @key Args @count plural" => 'Context string',
 
       "Context Unquoted plural{$etx}Context Unquoted @count plural" => 'Context string unquoted',
       "Context Single Quoted plural{$etx}Context Single Quoted @count plural" => 'Context string single quoted',
diff --git a/core/modules/locale/src/Tests/LocaleUpdateInterfaceTest.php b/core/modules/locale/src/Tests/LocaleUpdateInterfaceTest.php
index bda7eec..ad49550 100644
--- a/core/modules/locale/src/Tests/LocaleUpdateInterfaceTest.php
+++ b/core/modules/locale/src/Tests/LocaleUpdateInterfaceTest.php
@@ -87,7 +87,7 @@ public function testInterface() {
     $this->assertRaw(t('Missing translations for: @languages. See the <a href="@updates">Available translation updates</a> page for more information.', array('@languages' => t('German'), '@updates' => \Drupal::url('locale.translate_status'))), 'Missing translations message');
     $this->drupalGet('admin/reports/translations');
     $this->assertText(t('Missing translations for one project'), 'No translations found');
-    $this->assertText(SafeMarkup::format('@module (@version). !info', array('@module' => 'Locale test translate', '@version' => '1.3-dev', '!info' => t('No translation files are provided for development releases.'))), 'Release details');
+    $this->assertText(SafeMarkup::format('@module (@version). @info', array('@module' => 'Locale test translate', '@version' => '1.3-dev', '@info' => t('No translation files are provided for development releases.'))), 'Release details');
     $this->assertText(t('No translation files are provided for development releases.'), 'Release info');
 
     // Override Drupal core translation status as 'no translations found'.
@@ -111,7 +111,7 @@ public function testInterface() {
 
     // Check if translations are available for Drupal core.
     $this->drupalGet('admin/reports/translations');
-    $this->assertText(t('Updates for: !project', array('!project' => t('Drupal core'))), 'Translations found');
+    $this->assertText(t('Updates for: @project', array('@project' => t('Drupal core'))), 'Translations found');
     $this->assertText(SafeMarkup::format('@module (@date)', array('@module' => t('Drupal core'), '@date' => format_date(REQUEST_TIME, 'html_date'))), 'Core translation update');
     $update_button = $this->xpath('//input[@type="submit"][@value="' . t('Update translations') . '"]');
     $this->assertTrue($update_button, 'Update translations button');
diff --git a/core/modules/locale/tests/locale_test.js b/core/modules/locale/tests/locale_test.js
index ba62b75..b600803 100644
--- a/core/modules/locale/tests/locale_test.js
+++ b/core/modules/locale/tests/locale_test.js
@@ -26,7 +26,7 @@ Drupal.t("Context Unquoted t", {}, {context: "Context string unquoted"});
 Drupal.t("Context Single Quoted t", {}, {'context': "Context string single quoted"});
 Drupal.t("Context Double Quoted t", {}, {"context": "Context string double quoted"});
 
-Drupal.t("Context !key Args t", {'!key': 'value'}, {context: "Context string"});
+Drupal.t("Context @key Args t", {'@key': 'value'}, {context: "Context string"});
 
 Drupal.formatPlural(1, "Standard Call plural", "Standard Call @count plural");
 Drupal
@@ -49,4 +49,4 @@ Drupal.formatPlural(1, "Context Unquoted plural", "Context Unquoted @count plura
 Drupal.formatPlural(1, "Context Single Quoted plural", "Context Single Quoted @count plural", {}, {'context': "Context string single quoted"});
 Drupal.formatPlural(1, "Context Double Quoted plural", "Context Double Quoted @count plural", {}, {"context": "Context string double quoted"});
 
-Drupal.formatPlural(1, "Context !key Args plural", "Context !key Args @count plural", {'!key': 'value'}, {context: "Context string"});
+Drupal.formatPlural(1, "Context @key Args plural", "Context @key Args @count plural", {'@key': 'value'}, {context: "Context string"});
