diff --git a/core/lib/Drupal/Core/StringTranslation/Translator/FileTranslation.php b/core/lib/Drupal/Core/StringTranslation/Translator/FileTranslation.php
index ecd5a61..1ff2ea8 100644
--- a/core/lib/Drupal/Core/StringTranslation/Translator/FileTranslation.php
+++ b/core/lib/Drupal/Core/StringTranslation/Translator/FileTranslation.php
@@ -60,8 +60,8 @@ protected function getLanguage($langcode) {
    * Finds installer translations either for a specific or all languages.
    *
    * Filenames must match the pattern:
-   *  - 'drupal-[number].*.[langcode].po
-   *  - 'drupal-[number].*.*.po
+   *  - 'drupal-*.[langcode].po (if langcode is provided)
+   *  - 'drupal-*.*.po (if no langcode is provided)
    *
    * @param string $langcode
    *   (optional) The language code corresponding to the language for which we
@@ -75,11 +75,25 @@ protected function getLanguage($langcode) {
    * @see file_scan_directory()
    */
   public function findTranslationFiles($langcode = NULL) {
-    $files = file_scan_directory($this->directory, '!drupal-\d+\.[^\.]+\.' . (!empty($langcode) ? preg_quote($langcode, '!') : '[^\.]+') . '\.po$!', array('recurse' => FALSE));
+    $files = file_scan_directory($this->directory, $this->getTranslationFilesPattern($langcode), array('recurse' => FALSE));
     return $files;
   }
 
   /**
+   * Provides translation file pattern.
+   *
+   * @param string $langcode
+   *   The language code corresponding to the language for which we
+   *   want to find translation files.
+   *
+   * @return string
+   *  String file pattern.
+   */
+  protected function getTranslationFilesPattern($langcode) {
+    return '!drupal-[0-9a-z\.-]+\.' . (!empty($langcode) ? preg_quote($langcode, '!') : '[^\.]+') . '\.po$!';
+  }
+
+  /**
    * Reads the given Gettext PO files into a data structure.
    *
    * @param string $langcode
diff --git a/core/modules/simpletest/files/translations/drupal-8.0.de.po b/core/modules/simpletest/files/translations/drupal-8.0.0-beta2.hu.po
similarity index 100%
rename from core/modules/simpletest/files/translations/drupal-8.0.de.po
rename to core/modules/simpletest/files/translations/drupal-8.0.0-beta2.hu.po
diff --git a/core/modules/simpletest/files/translations/drupal-8.0.hu.po b/core/modules/simpletest/files/translations/drupal-8.0.0.de.po
similarity index 100%
rename from core/modules/simpletest/files/translations/drupal-8.0.hu.po
rename to core/modules/simpletest/files/translations/drupal-8.0.0.de.po
diff --git a/core/modules/system/src/Tests/Installer/InstallTranslationFilePatternTest.php b/core/modules/system/src/Tests/Installer/InstallTranslationFilePatternTest.php
new file mode 100644
index 0000000..51b3e47
--- /dev/null
+++ b/core/modules/system/src/Tests/Installer/InstallTranslationFilePatternTest.php
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\Installer\InstallTranslationFilePatternTest.
+ */
+
+namespace Drupal\system\Tests\Installer;
+
+use Drupal\Core\StringTranslation\Translator\FileTranslation;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * Tests for installer language support.
+ *
+ * @group Installer
+ */
+class InstallTranslationFilePatternTest extends UnitTestCase {
+
+  /**
+   * @var \Drupal\Core\StringTranslation\Translator\FileTranslation
+   */
+  protected $fileTranslation;
+
+  /**
+   * @var \ReflectionMethod
+   */
+  protected $filePatternMethod;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setup() {
+    parent::setUp();
+    $this->fileTranslation = new FileTranslation('filename');
+    $method = new \ReflectionMethod('\Drupal\Core\StringTranslation\Translator\FileTranslation', 'getTranslationFilesPattern');
+    $method->setAccessible(true);
+    $this->filePatternMethod = $method;
+  }
+
+  /**
+   * @dataProvider providerValidTranslationFiles
+   */
+  public function testFilesPatternValid($langcode, $filename) {
+    $pattern = $this->filePatternMethod->invoke($this->fileTranslation, $langcode);
+    $this->assertNotEmpty(preg_match($pattern, $filename));
+  }
+
+  /**
+   * @return array
+   */
+  public function providerValidTranslationFiles() {
+    return array(
+      array('hu', 'drupal-8.0.0-alpha1.hu.po'),
+      array('ta', 'drupal-8.10.10-beta12.ta.po'),
+      array('hi', 'drupal-8.0.0.hi.po'),
+    );
+  }
+
+  /**
+   * @dataProvider providerInvalidTranslationFiles
+   */
+  public function testFilesPatternInvalid($langcode, $filename) {
+    $pattern = $this->filePatternMethod->invoke($this->fileTranslation, $langcode);
+    $this->assertEmpty(preg_match($pattern, $filename));
+  }
+
+  /**
+   * @return array
+   */
+  public function providerInvalidTranslationFiles() {
+    return array(
+      array('hu', 'drupal-alpha1-*-hu.po'),
+      array('ta', 'drupal-beta12.ta'),
+      array('hi', 'drupal-hi.po'),
+      array('de', 'drupal-dummy-de.po'),
+      array('hu', 'drupal-10.0.1.alpha1-hu.po'),
+    );
+  }
+
+}
diff --git a/core/modules/system/src/Tests/Installer/InstallerLanguageDirectionTest.php b/core/modules/system/src/Tests/Installer/InstallerLanguageDirectionTest.php
index 74b8be2..cd7bce5 100644
--- a/core/modules/system/src/Tests/Installer/InstallerLanguageDirectionTest.php
+++ b/core/modules/system/src/Tests/Installer/InstallerLanguageDirectionTest.php
@@ -27,17 +27,16 @@ class InstallerLanguageDirectionTest extends InstallerTestBase {
    * {@inheritdoc}
    */
   protected function setUpLanguage() {
+    // Place a custom local translation in the translations directory.
+    mkdir(DRUPAL_ROOT . '/' . $this->siteDirectory . '/files/translations', 0777, TRUE);
+    file_put_contents(DRUPAL_ROOT . '/' . $this->siteDirectory . '/files/translations/drupal-8.0.0.ar.po', "msgid \"\"\nmsgstr \"\"\nmsgid \"Save and continue\"\nmsgstr \"Save and continue Arabic\"");
+
     parent::setUpLanguage();
     // After selecting a different language than English, all following screens
     // should be translated already.
-    // @todo Instead of actually downloading random translations that cannot be
-    //   asserted, write and supply a translation file. Until then, take
-    //   over whichever string happens to be there, but ensure that the English
-    //   string no longer appears.
     $elements = $this->xpath('//input[@type="submit"]/@value');
-    $string = (string) current($elements);
-    $this->assertNotEqual($string, 'Save and continue');
-    $this->translations['Save and continue'] = $string;
+    $this->assertEqual((string) current($elements), 'Save and continue Arabic');
+    $this->translations['Save and continue'] = 'Save and continue Arabic';
 
     // Verify that language direction is right-to-left.
     $direction = (string) current($this->xpath('/html/@dir'));
diff --git a/core/modules/system/src/Tests/Installer/InstallerLanguageTest.php b/core/modules/system/src/Tests/Installer/InstallerLanguageTest.php
index b32ef40..5bb165b 100644
--- a/core/modules/system/src/Tests/Installer/InstallerLanguageTest.php
+++ b/core/modules/system/src/Tests/Installer/InstallerLanguageTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\system\Tests\Installer;
 
-use Drupal\simpletest\WebTestBase;
+use Drupal\simpletest\KernelTestBase;
 use Drupal\Core\StringTranslation\Translator\FileTranslation;
 
 /**
@@ -15,7 +15,7 @@
  *
  * @group Installer
  */
-class InstallerLanguageTest extends WebTestBase {
+class InstallerLanguageTest extends KernelTestBase {
 
   /**
    * Tests that the installer can find translation files.
@@ -24,9 +24,9 @@ function testInstallerTranslationFiles() {
     // Different translation files would be found depending on which language
     // we are looking for.
     $expected_translation_files = array(
-      NULL => array('drupal-8.0.hu.po', 'drupal-8.0.de.po'),
-      'de' => array('drupal-8.0.de.po'),
-      'hu' => array('drupal-8.0.hu.po'),
+      NULL => array('drupal-8.0.0-beta2.hu.po', 'drupal-8.0.0.de.po'),
+      'de' => array('drupal-8.0.0.de.po'),
+      'hu' => array('drupal-8.0.0-beta2.hu.po'),
       'it' => array(),
     );
 
diff --git a/core/modules/system/src/Tests/Installer/InstallerTranslationTest.php b/core/modules/system/src/Tests/Installer/InstallerTranslationTest.php
index 8ebf010..5a24f27 100644
--- a/core/modules/system/src/Tests/Installer/InstallerTranslationTest.php
+++ b/core/modules/system/src/Tests/Installer/InstallerTranslationTest.php
@@ -28,17 +28,16 @@ class InstallerTranslationTest extends InstallerTestBase {
    * Overrides InstallerTest::setUpLanguage().
    */
   protected function setUpLanguage() {
+    // Place a custom local translation in the translations directory.
+    mkdir(DRUPAL_ROOT . '/' . $this->siteDirectory . '/files/translations', 0777, TRUE);
+    file_put_contents(DRUPAL_ROOT . '/' . $this->siteDirectory . '/files/translations/drupal-8.0.0.de.po', "msgid \"\"\nmsgstr \"\"\nmsgid \"Save and continue\"\nmsgstr \"Save and continue German\"");
+
     parent::setUpLanguage();
     // After selecting a different language than English, all following screens
     // should be translated already.
-    // @todo Instead of actually downloading random translations that cannot be
-    //   asserted, write and supply a German translation file. Until then, take
-    //   over whichever string happens to be there, but ensure that the English
-    //   string no longer appears.
     $elements = $this->xpath('//input[@type="submit"]/@value');
-    $string = (string) current($elements);
-    $this->assertNotEqual($string, 'Save and continue');
-    $this->translations['Save and continue'] = $string;
+    $this->assertEqual((string) current($elements), 'Save and continue German');
+    $this->translations['Save and continue'] = 'Save and continue German';
 
     // Check the language direction.
     $direction = (string) current($this->xpath('/html/@dir'));
