diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc index 5a5f92339baadf0b32bf47e30a654e4cc6103514..f1cee20d87453ad197f4d208a92775c11fcd5cd3 100644 --- a/core/includes/install.core.inc +++ b/core/includes/install.core.inc @@ -631,8 +631,8 @@ function install_run_task($task, &$install_state) { if (isset($batches['operations'])) { $batches = [$batches]; } - foreach ($batches as $batch) { - batch_set($batch); + foreach ($batches as $batch_definition) { + batch_set($batch_definition); // For interactive batches, we need to store the fact that this batch // task is currently running. Otherwise, we need to make sure the batch // will complete in one page request. diff --git a/core/profiles/testing_multilingual/config/install/locale.settings.yml b/core/profiles/testing_multilingual/config/install/locale.settings.yml new file mode 100644 index 0000000000000000000000000000000000000000..057048411a4a94046c807798a1b2301dc76cca04 --- /dev/null +++ b/core/profiles/testing_multilingual/config/install/locale.settings.yml @@ -0,0 +1,13 @@ +cache_strings: true +translate_english: false +javascript: + directory: languages +translation: + use_source: local + default_filename: '%project-%version.%language.po' + default_server_pattern: 'https://ftp.drupal.org/files/translations/%core/%project/%project-%version.%language.po' + overwrite_customized: false + overwrite_not_customized: true + update_interval_days: 0 + path: '' + import_enabled: true diff --git a/core/profiles/testing_multilingual/testing_multilingual.info.yml b/core/profiles/testing_multilingual/testing_multilingual.info.yml index 9539b492b22c44c61e758230156280921f7c3bad..464d6ba385b02a9783ba24f7ed697adee48aac3f 100644 --- a/core/profiles/testing_multilingual/testing_multilingual.info.yml +++ b/core/profiles/testing_multilingual/testing_multilingual.info.yml @@ -5,4 +5,5 @@ version: VERSION hidden: true install: - locale + - locale_test_translate - tour diff --git a/core/tests/Drupal/FunctionalTests/Installer/InstallerTranslationMultipleLanguageNonInteractiveTest.php b/core/tests/Drupal/FunctionalTests/Installer/InstallerTranslationMultipleLanguageNonInteractiveTest.php new file mode 100644 index 0000000000000000000000000000000000000000..45f8a52b0dca39293a79871ae64a53cc227b4683 --- /dev/null +++ b/core/tests/Drupal/FunctionalTests/Installer/InstallerTranslationMultipleLanguageNonInteractiveTest.php @@ -0,0 +1,146 @@ +<?php + +namespace Drupal\FunctionalTests\Installer; + +use Drupal\Tests\BrowserTestBase; + +/** + * Tests translation files for multiple languages get imported during install. + * + * @group Installer + */ +class InstallerTranslationMultipleLanguageNonInteractiveTest extends BrowserTestBase { + + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + + /** + * Switch to the multilingual testing profile. + * + * @var string + */ + protected $profile = 'testing_multilingual'; + + /** + * {@inheritdoc} + */ + protected function prepareEnvironment() { + parent::prepareEnvironment(); + // Place custom local translations 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', $this->getPo('de')); + file_put_contents(DRUPAL_ROOT . '/' . $this->siteDirectory . '/files/translations/drupal-8.0.0.es.po', $this->getPo('es')); + } + + /** + * Returns the string for the test .po file. + * + * @param string $langcode + * The language code. + * + * @return string + * Contents for the test .po file. + */ + protected function getPo($langcode) { + return <<<ENDPO +msgid "" +msgstr "" + +msgid "Save and continue" +msgstr "Save and continue $langcode" + +msgid "Anonymous" +msgstr "Anonymous $langcode" + +msgid "Language" +msgstr "Language $langcode" + +#: Testing site name configuration during the installer. +msgid "Drupal" +msgstr "Drupal" +ENDPO; + } + + /** + * {@inheritdoc} + */ + protected function installParameters() { + $params = parent::installParameters(); + $params['forms']['install_configure_form']['site_name'] = 'SITE_NAME_en'; + return $params; + } + + /** + * Tests that translations ended up at the expected places. + */ + public function testTranslationsLoaded() { + $this->drupalLogin($this->createUser([], NULL, TRUE)); + // Ensure the title is correct. + $this->assertEquals('SITE_NAME_en', \Drupal::config('system.site')->get('name')); + + // Verify German and Spanish were configured. + $this->drupalGet('admin/config/regional/language'); + $this->assertSession()->pageTextContains('German'); + $this->assertSession()->pageTextContains('Spanish'); + // If the installer was English or we used a profile that keeps English, we + // expect that configured also. Otherwise English should not be configured + // on the site. + $this->assertSession()->pageTextContains('English'); + + // Verify the strings from the translation files were imported. + $this->verifyImportedStringsTranslated(); + + /** @var \Drupal\language\ConfigurableLanguageManager $language_manager */ + $language_manager = \Drupal::languageManager(); + + // If the site was installed in a foreign language (only tested with German + // in subclasses), then the active configuration should be updated and no + // override should exist in German. Otherwise the German translation should + // end up in overrides the same way as Spanish (which is not used as a site + // installation language). English should be available based on profile + // information and should be possible to add if not yet added, making + // English overrides available. + + $config = \Drupal::config('user.settings'); + $override_de = $language_manager->getLanguageConfigOverride('de', 'user.settings'); + $override_en = $language_manager->getLanguageConfigOverride('en', 'user.settings'); + $override_es = $language_manager->getLanguageConfigOverride('es', 'user.settings'); + + // Active configuration should be English. + $this->assertEquals('Anonymous', $config->get('anonymous')); + $this->assertEquals('en', $config->get('langcode')); + // There should not be an English override. + $this->assertTrue($override_en->isNew()); + // German should be an override. + $this->assertEquals('Anonymous de', $override_de->get('anonymous')); + + // Spanish is always an override (never used as installation language). + $this->assertEquals('Anonymous es', $override_es->get('anonymous')); + + // Test translation from locale_test module. + $this->assertEquals('Montag', t('Monday', [], ['langcode' => 'de'])); + } + + /** + * Helper function to verify that the expected strings are translated. + */ + protected function verifyImportedStringsTranslated() { + $test_samples = ['Save and continue', 'Anonymous', 'Language']; + $langcodes = ['de', 'es']; + + foreach ($test_samples as $sample) { + foreach ($langcodes as $langcode) { + $edit = []; + $edit['langcode'] = $langcode; + $edit['translation'] = 'translated'; + $edit['string'] = $sample; + $this->drupalGet('admin/config/regional/translate'); + $this->submitForm($edit, 'Filter'); + $this->assertSession()->pageTextContains($sample . ' ' . $langcode); + } + } + } + +}