diff --git a/core/modules/locale/src/LocaleConfigSubscriber.php b/core/modules/locale/src/LocaleConfigSubscriber.php index ee20daf..8a23ea1 100644 --- a/core/modules/locale/src/LocaleConfigSubscriber.php +++ b/core/modules/locale/src/LocaleConfigSubscriber.php @@ -82,7 +82,7 @@ public static function getSubscribedEvents() { public function onConfigSave(ConfigCrudEvent $event) { // Only attempt to feed back configuration translation changes to locale if // the update itself was not initiated by locale data changes. - if (!$this->localeConfigManager->isUpdatingTranslationsFromLocale()) { + if (!drupal_installation_attempted() && !$this->localeConfigManager->isUpdatingTranslationsFromLocale()) { $config = $event->getConfig(); $langcode = $config->get('langcode') ?: 'en'; $this->updateLocaleStorage($config, $langcode); @@ -98,7 +98,7 @@ public function onConfigSave(ConfigCrudEvent $event) { public function onOverrideChange(LanguageConfigOverrideCrudEvent $event) { // Only attempt to feed back configuration override changes to locale if // the update itself was not initiated by locale data changes. - if (!$this->localeConfigManager->isUpdatingTranslationsFromLocale()) { + if (!drupal_installation_attempted() && !$this->localeConfigManager->isUpdatingTranslationsFromLocale()) { $translation_config = $event->getLanguageConfigOverride(); $langcode = $translation_config->getLangcode(); $reference_config = $this->configFactory->getEditable($translation_config->getName())->get(); @@ -204,23 +204,25 @@ protected function resetExistingTranslations($name, $translatable, $reference_co * The source string value. * @param string $context * The source string context. - * @param string $translation + * @param string $new_translation * The translation string. * @param string $langcode * The language code of the translation. */ - protected function saveCustomizedTranslation($name, $source, $context, $translation, $langcode) { + protected function saveCustomizedTranslation($name, $source, $context, $new_translation, $langcode) { $locale_translation = $this->localeConfigManager->getStringTranslation($name, $langcode, $source, $context); if (!empty($locale_translation)) { // Save this translation as custom if it was a new translation and not the // same as the source. (The interface prefills translation values with the - // source). Or if there was an existing translation and the user changed - // it (even if it was changed back to the original value). Otherwise the - // translation file would be overwritten with the locale copy again later. - if (($locale_translation->isNew() && $source != $translation) || - (!$locale_translation->isNew() && $translation != $locale_translation->getString())) { + // source). Or if there was an existing (non-empty) translation and the + // user changed it (even if it was changed back to the original value). + // Otherwise the translation file would be overwritten with the locale + // copy again later. + $existing_translation = $locale_translation->getString(); + if (($locale_translation->isNew() && $source != $new_translation) || + (!$locale_translation->isNew() && ((empty($existing_translation) && $source != $new_translation) || ((!empty($existing_translation) && $new_translation != $existing_translation))))) { $locale_translation - ->setString($translation) + ->setString($new_translation) ->setCustomized(TRUE) ->save(); } diff --git a/core/modules/system/src/Tests/Installer/InstallerTranslationMultipleLanguageTest.php b/core/modules/system/src/Tests/Installer/InstallerTranslationMultipleLanguageTest.php index a16369b..a7051c7 100644 --- a/core/modules/system/src/Tests/Installer/InstallerTranslationMultipleLanguageTest.php +++ b/core/modules/system/src/Tests/Installer/InstallerTranslationMultipleLanguageTest.php @@ -53,6 +53,9 @@ protected function getPo($langcode) { msgid "Anonymous" msgstr "Anonymous $langcode" + +msgid "Language" +msgstr "Language $langcode" ENDPO; } @@ -75,19 +78,7 @@ public function testTranslationsLoaded() { } // Verify the strings from the translation files were imported. - $test_samples = ['Save and continue', 'Anonymous']; - $langcodes = ['de', 'es']; - - foreach($test_samples as $sample) { - foreach($langcodes as $langcode) { - $edit = array(); - $edit['langcode'] = $langcode; - $edit['translation'] = 'translated'; - $edit['string'] = $sample; - $this->drupalPostForm('admin/config/regional/translate', $edit, t('Filter')); - $this->assertText($sample . ' ' . $langcode); - } - } + $this->verifyImportedStringsTranslated(); /** @var \Drupal\language\ConfigurableLanguageManager $language_manager */ $language_manager = \Drupal::languageManager(); @@ -127,6 +118,17 @@ public function testTranslationsLoaded() { $override_en = $language_manager->getLanguageConfigOverride('en', 'user.settings'); $this->assertEqual($override_en->get('anonymous'), 'Anonymous'); } + + // Activate a module, to make sure that config is not overriden by module + // installation. + $edit = array( + 'modules[Core][views][enable]' => TRUE, + 'modules[Core][filter][enable]' => TRUE, + ); + $this->drupalPostForm('admin/modules', $edit, t('Save configuration')); + + // Verify the strings from the translation are still as expected. + $this->verifyImportedStringsTranslated(); } else { // Active configuration should be English. @@ -140,6 +142,26 @@ public function testTranslationsLoaded() { // Spanish is always an override (never used as installation language). $this->assertEqual($override_es->get('anonymous'), 'Anonymous es'); + + } + + /** + * 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 = array(); + $edit['langcode'] = $langcode; + $edit['translation'] = 'translated'; + $edit['string'] = $sample; + $this->drupalPostForm('admin/config/regional/translate', $edit, t('Filter')); + $this->assertText($sample . ' ' . $langcode); + } + } } }