diff --git a/core/modules/config_translation/src/Tests/ConfigTranslationCacheTest.php b/core/modules/config_translation/src/Tests/ConfigTranslationCacheTest.php new file mode 100644 index 0000000..3d4407c --- /dev/null +++ b/core/modules/config_translation/src/Tests/ConfigTranslationCacheTest.php @@ -0,0 +1,183 @@ +getPermissionName(), + $full_html_format->getPermissionName(), + $filter_test_format->getPermissionName(), + 'access site-wide contact form', + 'access contextual links', + 'administer account settings', + 'administer themes', + 'bypass node access', + 'administer content types', + 'translate interface', + 'administer entity_test fields', + ] + ); + // Create and login user. + $this->translatorUser = $this->drupalCreateUser($translator_permissions); + $this->adminUser = $this->drupalCreateUser($admin_permissions); + + // Add languages. + foreach ($this->langcodes as $langcode) { + ConfigurableLanguage::createFromLangcode($langcode)->save(); + } + $this->drupalPlaceBlock('local_tasks_block'); + $this->drupalPlaceBlock('page_title_block'); + } + + /** + * Tests the translation of field and field storage configuration. + */ + public function testFieldConfigTranslation() { + // Add a test field which has a translatable field setting and a + // translatable field storage setting. + $field_name = strtolower($this->randomMachineName()); + $field_storage = FieldStorageConfig::create([ + 'field_name' => $field_name, + 'entity_type' => 'entity_test', + 'type' => 'test_field', + ]); + + $translatable_storage_setting = $this->randomString(); + $field_storage->setSetting('translatable_storage_setting', $translatable_storage_setting); + $field_storage->save(); + + $bundle = strtolower($this->randomMachineName()); + entity_test_create_bundle($bundle); + $field = FieldConfig::create([ + 'field_name' => $field_name, + 'entity_type' => 'entity_test', + 'bundle' => $bundle, + ]); + + $translatable_field_setting = $this->randomString(); + $field->setSetting('translatable_field_setting', $translatable_field_setting); + $field->save(); + + $this->drupalLogin($this->translatorUser); + + $this->drupalGet("/entity_test/structure/$bundle/fields/entity_test.$bundle.$field_name/translate"); + $this->clickLink('Add'); + + $this->assertText('Translatable field setting'); + $this->assertEscaped($translatable_field_setting); + $this->assertText('Translatable storage setting'); + $this->assertEscaped($translatable_storage_setting); + + // Add translation for label. + $field_label_fr = $this->randomString(); + $edit = array( + "translation[config_names][field.field.entity_test.$bundle.$field_name][label]" => $field_label_fr, + ); + $this->drupalPostForm(NULL, $edit, 'Save translation'); + $this->drupalLogout(); + + // Check if the translated label appear. + $this->drupalLogin($this->adminUser); + $this->drupalGet("/fr/entity_test/structure/$bundle/fields"); + $this->assertEscaped($field_label_fr); + + // Clear cache on French version and check for translated label. + $this->drupalPostForm('/fr/admin/config/development/performance', array(), 'Clear all caches'); + $this->drupalGet("/fr/entity_test/structure/$bundle/fields"); + // Check if the translation still there. + $this->assertEscaped($field_label_fr); + + // Clear cache on default version and check for translated label. + $this->drupalPostForm('/admin/config/development/performance', array(), 'Clear all caches'); + $this->drupalGet("/fr/entity_test/structure/$bundle/fields"); + // Check if the translation still there. + $this->assertEscaped($field_label_fr); + } + +} diff --git a/core/modules/language/src/ConfigurableLanguageManager.php b/core/modules/language/src/ConfigurableLanguageManager.php index 59d6d54..03d9d3d 100644 --- a/core/modules/language/src/ConfigurableLanguageManager.php +++ b/core/modules/language/src/ConfigurableLanguageManager.php @@ -13,6 +13,7 @@ use Drupal\Core\Language\Language; use Drupal\Core\Language\LanguageDefault; use Drupal\Core\Language\LanguageManager; +use Drupal\Core\Session\AccountInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\Core\Url; use Drupal\language\Config\LanguageConfigFactoryOverrideInterface; @@ -143,6 +144,19 @@ public function init() { } /** + * Sets language overrides from current user. + * + * @param \Drupal\Core\Session\AccountInterface $current_user + * @param \Drupal\language\LanguageNegotiatorInterface $negotiator + */ + public function setLanguageFromCurrentUser(AccountInterface $current_user, LanguageNegotiatorInterface $negotiator) { + $negotiator->setCurrentUser($current_user); + $negotiator->reset(); + $this->setNegotiator($negotiator); + $this->setConfigOverrideLanguage($this->getCurrentLanguage()); + } + + /** * {@inheritdoc} */ public function isMultilingual() { diff --git a/core/modules/language/src/LanguageServiceProvider.php b/core/modules/language/src/LanguageServiceProvider.php index c3f1cd1..bf81911 100644 --- a/core/modules/language/src/LanguageServiceProvider.php +++ b/core/modules/language/src/LanguageServiceProvider.php @@ -59,9 +59,14 @@ public function alter(ContainerBuilder $container) { $container->setParameter('language.default_values', $default_language_values); } - // For monolingual sites, we explicitly set the default language for the - // language config override service as there is no language negotiation. - if (!$this->isMultilingual()) { + // For multilingual sites, set the language override from current user. + if ($this->isMultilingual()) { + $container->getDefinition('language_manager') + ->addMethodCall('setLanguageFromCurrentUser', array(new Reference('current_user'), new Reference('language_negotiator'))); + } + else { + // For monolingual sites, we explicitly set the default language for the + // language config override service as there is no language negotiation. $container->getDefinition('language.config_factory_override') ->addMethodCall('setLanguageFromDefault', array(new Reference('language.default'))); }