diff --git a/core/modules/config/src/Tests/LanguageNegotiationFormOverrideTest.php b/core/modules/config/src/Tests/LanguageNegotiationFormOverrideTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b5289cb776740b4051d433f2cc544e2f306af1c2 --- /dev/null +++ b/core/modules/config/src/Tests/LanguageNegotiationFormOverrideTest.php @@ -0,0 +1,63 @@ +<?php + +/** + * @file + * Contains \Drupal\config\Tests\LanguageNegotiationFormOverrideTest. + */ + +namespace Drupal\config\Tests; + +use Drupal\simpletest\WebTestBase; + +/** + * Tests language-negotiation overrides are not on language-negotiation form. + * + * @group config + * @see \Drupal\Core\Form\ConfigFormBase + */ +class LanguageNegotiationFormOverrideTest extends WebTestBase { + + public static $modules = array('language', 'locale'); + + /** + * Tests that overrides do not affect language-negotiation form values. + */ + public function testFormWithOverride() { + $this->drupalLogin($this->rootUser); + $overridden_value_en = 'whatever'; + $overridden_value_es = 'loquesea'; + + // Set up an override. + $settings['config']['language.negotiation']['url']['prefixes'] = (object) array( + 'value' => array('en' => $overridden_value_en, 'es' => $overridden_value_es), + 'required' => TRUE, + ); + $this->writeSettings($settings); + + // Add predefined language. + $edit = array( + 'predefined_langcode' => 'es', + ); + $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add language')); + + // Overridden string for language-negotiation should not exist in the form. + $this->drupalGet('admin/config/regional/language/detection/url'); + + // The language-negotiation form should be found. + $this->assertText('Path prefix configuration', 'Language-negotiation form found for English.'); + + // The English override should not be found. + $this->assertNoFieldByName('prefix[en]', $overridden_value_en, 'Language-negotiation config override not found in English.'); + + // Now check the Spanish version of the page for the same thing. + $this->drupalGet($overridden_value_es . '/admin/config/regional/language/detection/url'); + + // The language-negotiation form should be found. + $this->assertText('Path prefix configuration', 'Language-negotiation form found for Spanish using the overridden prefix.'); + + // The Spanish override should not be found. + $this->assertNoFieldByName('prefix[es]', $overridden_value_es, 'Language-negotiation config override not found in Spanish.'); + + } + +} diff --git a/core/modules/language/language.module b/core/modules/language/language.module index 75013656212d2ed89f099e76e0321abdc985421c..472931640d5d795de13d4f95af1763fe266f8c5d 100644 --- a/core/modules/language/language.module +++ b/core/modules/language/language.module @@ -284,6 +284,9 @@ function language_get_default_langcode($entity_type, $bundle) { /** * Reads language prefixes and uses the langcode if no prefix is set. + * + * @deprecated in Drupal 8.0.x-dev, will be removed before Drupal 9.0.0. + * Use \Drupal::config('language.negotiation')->get('url.prefixes') instead. */ function language_negotiation_url_prefixes() { return \Drupal::config('language.negotiation')->get('url.prefixes'); @@ -293,7 +296,8 @@ function language_negotiation_url_prefixes() { * Update the list of prefixes from the installed languages. */ function language_negotiation_url_prefixes_update() { - $prefixes = language_negotiation_url_prefixes(); + $config = \Drupal::configFactory()->getEditable('language.negotiation'); + $prefixes = $config->get('url.prefixes'); foreach (\Drupal::languageManager()->getLanguages() as $language) { // The prefix for this language should be updated if it's not assigned yet // or the prefix is set to the empty string. @@ -304,38 +308,19 @@ function language_negotiation_url_prefixes_update() { } // Otherwise we keep the configured prefix. } - language_negotiation_url_prefixes_save($prefixes); -} - -/** - * Saves language prefix settings. - */ -function language_negotiation_url_prefixes_save(array $prefixes) { - // @todo https://www.drupal.org/node/2403229 $prefixes can contain - // configuration overrides. - \Drupal::configFactory()->getEditable('language.negotiation') - ->set('url.prefixes', $prefixes) - ->save(); + $config->set('url.prefixes', $prefixes)->save(); } /** * Reads language domains. + * + * @deprecated in Drupal 8.0.x-dev, will be removed before Drupal 9.0.0. + * Use \Drupal::config('language.negotiation')->get('url.domains') instead. */ function language_negotiation_url_domains() { return \Drupal::config('language.negotiation')->get('url.domains'); } -/** - * Saves the language domain settings. - */ -function language_negotiation_url_domains_save(array $domains) { - // @todo https://www.drupal.org/node/2403229 $domains can contain - // configuration overrides. - \Drupal::configFactory()->getEditable('language.negotiation') - ->set('url.domains', $domains) - ->save(); -} - /** * Implements hook_modules_installed(). */ @@ -376,9 +361,10 @@ function language_configurable_language_insert(ConfigurableLanguageInterface $la } // Add language to the list of language domains. - $domains = language_negotiation_url_domains(); + $config = \Drupal::configFactory()->getEditable('language.negotiation'); + $domains = $config->get('url.domains'); $domains[$language->id()] = ''; - language_negotiation_url_domains_save($domains); + $config->set('url.domains', $domains)->save(); } /** @@ -386,14 +372,16 @@ function language_configurable_language_insert(ConfigurableLanguageInterface $la */ function language_configurable_language_delete(ConfigurableLanguageInterface $language) { // Remove language from language prefix list. - $prefixes = language_negotiation_url_prefixes(); + $config = \Drupal::configFactory()->getEditable('language.negotiation'); + $prefixes = $config->get('url.prefixes'); unset($prefixes[$language->id()]); - language_negotiation_url_prefixes_save($prefixes); + $config->set('url.prefixes', $prefixes)->save(); // Remove language from language domain list. - $domains = language_negotiation_url_domains(); + $config = \Drupal::configFactory()->getEditable('language.negotiation'); + $domains = $config->get('url.domains'); unset($domains[$language->id()]); - language_negotiation_url_domains_save($domains); + $config->set('url.domains', $domains)->save(); } /** diff --git a/core/modules/language/src/Form/NegotiationUrlForm.php b/core/modules/language/src/Form/NegotiationUrlForm.php index b304046296e20e3aef25aa9371dcda0672d249fb..588df302eeece053e65af0ee4493cbbe9437f435 100644 --- a/core/modules/language/src/Form/NegotiationUrlForm.php +++ b/core/modules/language/src/Form/NegotiationUrlForm.php @@ -111,8 +111,8 @@ public function buildForm(array $form, FormStateInterface $form_state) { ); $languages = $this->languageManager->getLanguages(); - $prefixes = language_negotiation_url_prefixes(); - $domains = language_negotiation_url_domains(); + $prefixes = $config->get('url.prefixes'); + $domains = $config->get('url.domains'); foreach ($languages as $langcode => $language) { $t_args = array('%language' => $language->getName(), '%langcode' => $language->getId()); $form['prefix'][$langcode] = array( @@ -211,12 +211,11 @@ public function submitForm(array &$form, FormStateInterface $form_state) { // Save selected format (prefix or domain). $this->config('language.negotiation') ->set('url.source', $form_state->getValue('language_negotiation_url_part')) + // Save new domain and prefix values. + ->set('url.prefixes', $form_state->getValue('prefix')) + ->set('url.domains', $form_state->getValue('domain')) ->save(); - // Save new domain and prefix values. - language_negotiation_url_prefixes_save($form_state->getValue('prefix')); - language_negotiation_url_domains_save($form_state->getValue('domain')); - parent::submitForm($form, $form_state); } diff --git a/core/modules/system/src/Tests/ParamConverter/UpcastingTest.php b/core/modules/system/src/Tests/ParamConverter/UpcastingTest.php index 53888d99ddbdc38b1fa721f76e0bda78a46fc443..f8ea8eb1c5766592ba08b8f2b1c6b503243565ca 100644 --- a/core/modules/system/src/Tests/ParamConverter/UpcastingTest.php +++ b/core/modules/system/src/Tests/ParamConverter/UpcastingTest.php @@ -67,7 +67,9 @@ public function testSameTypes() { public function testEntityLanguage() { $language = ConfigurableLanguage::createFromLangcode('de'); $language->save(); - language_negotiation_url_prefixes_save(array('de' => 'de')); + \Drupal::configFactory()->getEditable('language.negotiation') + ->set('url.prefixes', array('de' => 'de')) + ->save(); // The container must be recreated after adding a new language. $this->rebuildContainer();