diff --git a/core/config/schema/core.data_types.schema.yml b/core/config/schema/core.data_types.schema.yml
index 3d4f3a0b00b6cbdef96e5c7281606907a81ca547..5b0b0fa4eb981d9c23cdbb80e9d3e640e0d1b20c 100644
--- a/core/config/schema/core.data_types.schema.yml
+++ b/core/config/schema/core.data_types.schema.yml
@@ -421,9 +421,19 @@ core.date_format.*:
       type: boolean
       label: 'Locked'
     pattern:
-      type: date_format
+      type: core_date_format_pattern.[%parent.locked]
       label: 'PHP date format'
 
+# Unlocked date formats should use the translatable type.
+core_date_format_pattern.0:
+  type: date_format
+  label: 'Date format'
+
+# Locked date formats are just used to transport the value.
+core_date_format_pattern.1:
+  type: string
+  label: 'Date format'
+
 # Generic field settings schemas.
 
 field.storage_settings.*:
diff --git a/core/lib/Drupal/Core/Config/TypedConfigManager.php b/core/lib/Drupal/Core/Config/TypedConfigManager.php
index 500fc3cfdff3b6625e1098e5628ca3e959cc390e..5c7aeeb29f8504dda69c5384f89f45a81c714b35 100644
--- a/core/lib/Drupal/Core/Config/TypedConfigManager.php
+++ b/core/lib/Drupal/Core/Config/TypedConfigManager.php
@@ -282,8 +282,12 @@ protected function replaceVariable($value, $data) {
         return $value;
       }
       elseif (!$parts) {
+        $value = $data[$name];
+        if (is_bool($value)) {
+          $value = (int) $value;
+        }
         // If no more parts left, this is the final property.
-        return (string)$data[$name];
+        return (string) $value;
       }
       else {
         // Get nested value and continue processing.
diff --git a/core/modules/config_translation/src/Tests/ConfigTranslationDateFormatUiTest.php b/core/modules/config_translation/src/Tests/ConfigTranslationDateFormatUiTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f68682c2d90285631da511393e469551ff0675e
--- /dev/null
+++ b/core/modules/config_translation/src/Tests/ConfigTranslationDateFormatUiTest.php
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\config_translation\Tests\ConfigTranslationDateFormatUiTest.
+ */
+
+namespace Drupal\config_translation\Tests;
+
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests the content translation behaviours on date formats.
+ *
+ * @group config_translation
+ */
+class ConfigTranslationDateFormatUiTest extends WebTestBase {
+
+  public static $modules = array(
+    'language',
+    'config_translation',
+    'system'
+  );
+
+  protected function setUp() {
+    parent::setUp();
+
+    // Enable additional languages.
+    $langcodes = ['de', 'es'];
+    foreach ($langcodes as $langcode) {
+      ConfigurableLanguage::createFromLangcode($langcode)->save();
+    }
+
+    $user = $this->drupalCreateUser(array(
+      'administer site configuration',
+      'translate configuration',
+    ));
+    $this->drupalLogin($user);
+  }
+
+  /**
+   * Tests date format translation behaviour.
+   */
+  public function testDateFormatUI() {
+    $this->drupalGet('admin/config/regional/date-time');
+
+    // Assert translation link unlocked date format.
+    $this->assertLinkByHref('admin/config/regional/date-time/formats/manage/medium/translate');
+
+    // Assert translation link locked date format.
+    $this->assertLinkByHref('admin/config/regional/date-time/formats/manage/html_datetime/translate');
+
+    // Date pattern is visible on unlocked date formats.
+    $this->drupalGet('admin/config/regional/date-time/formats/manage/medium/translate/de/add');
+    $this->assertField('translation[config_names][core.date_format.medium][pattern]');
+
+    // Date pattern is not visible on locked date formats.
+    $this->drupalGet('admin/config/regional/date-time/formats/manage/html_datetime/translate/es/add');
+    $this->assertNoField('translation[config_names][core.date_format.html_datetime][pattern]');
+  }
+
+}