diff -u b/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc --- b/core/modules/language/language.admin.inc +++ b/core/modules/language/language.admin.inc @@ -841,7 +841,7 @@ ); } - // Add empty row + // Add empty row. $form['mappings']['_new'] = array( 'browser_langcode' => array( '#type' => 'textfield', @@ -931,6 +931,9 @@ } $unique_values[$data['browser_langcode']] = $data['drupal_langcode']; } + elseif (empty($data['browser_langcode']) xor empty($data['drupal_langcode'])) { + form_set_error('mappings][' . $key . '][drupal_langcode', 'Both browser and Drupal language codes must be provided.'); + } } else { if (!empty($data['browser_langcode']) && !empty($data['drupal_langcode'])) { @@ -970,7 +973,7 @@ } /** - * Delete a language mapping form. + * Delete a browser language negotiation mapping. */ function language_negotiation_configure_browser_delete_form($form, &$form_state, $browser_langcode) { $form_state['browser_langcode'] = $browser_langcode; @@ -982,7 +985,7 @@ } /** - * Delete a language mapping submit. + * Delete a browser language negotiation mapping. */ function language_negotiation_configure_browser_delete_form_submit($form, &$form_state) { $browser_langcode = $form_state['browser_langcode']; diff -u b/core/modules/language/language.module b/core/modules/language/language.module --- b/core/modules/language/language.module +++ b/core/modules/language/language.module @@ -639 +639 @@ -} \ No newline at end of file +} diff -u b/core/modules/language/lib/Drupal/language/Tests/LanguageBrowserDetectionUnitTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageBrowserDetectionUnitTest.php --- b/core/modules/language/lib/Drupal/language/Tests/LanguageBrowserDetectionUnitTest.php +++ b/core/modules/language/lib/Drupal/language/Tests/LanguageBrowserDetectionUnitTest.php @@ -28,7 +28,7 @@ /** * Unit tests for the language_from_browser() function. */ - function testLanguageFromBrowser() { + function testLanguamergeFromBrowser() { $languages = array( // In our test case, 'en' has priority over 'en-US'. 'en' => new Language(array( @@ -154,2 +154,78 @@ } + + function testUIBrowserLanguageMappings() { + // User to manage languages. + $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages')); + $this->drupalLogin($admin_user); + + // Check that the configure link exists. + $this->drupalGet('admin/config/regional/language/detection'); + $this->assertLinkByHref('admin/config/regional/language/detection/browser'); + + // Check that defaults are loaded from language.mappings.yml. + $this->drupalGet('admin/config/regional/language/detection/browser'); + $this->assertField('edit-mappings-zh-cn-browser-langcode', 'zh-cn', 'Chinese browser language code found.'); + $this->assertField('edit-mappings-zh-cn-drupal-langcode', 'zh-hans-cn', 'Chinese Drupal language code found.'); + + // Delete zh-cn language code. + $browser_langcode = 'zh-cn'; + $this->drupalGet('admin/config/regional/language/detection/browser/delete/' . $browser_langcode); + $message = t('Are you sure you want to delete !browser_langcode?', array( + '!browser_langcode' => $browser_langcode, + )); + $this->assertText($message, 'Question found.'); + + // Confirm the delete. + $edit = array(); + $this->drupalPost('admin/config/regional/language/detection/browser/delete/' . $browser_langcode, $edit, t('Confirm')); + + // Check that ch-zn no longer exists. + $this->assertNoField('edit-mappings-zh-cn-browser-langcode', 'Chinese browser language code no longer exists.'); + + // Add a new custom mapping. + $edit = array( + 'mappings[_new][browser_langcode]' => 'xx', + 'mappings[_new][drupal_langcode]' => 'yy', + ); + $this->drupalPost('admin/config/regional/language/detection/browser', $edit, t('Save configuration')); + $this->assertField('edit-mappings-xx-browser-langcode', 'xx', 'Browser language code found.'); + $this->assertField('edit-mappings-xx-drupal-langcode', 'yy', 'Drupal language code found.'); + + // Add the same custom mapping again. + $this->drupalPost('admin/config/regional/language/detection/browser', $edit, t('Save configuration')); + $this->assertText('Browser language codes must be unique.', 'Error message displayed.'); + + // Add a new custom mapping with only a browser language code. + $edit = array( + 'mappings[_new][browser_langcode]' => 'xxxx', + 'mappings[_new][drupal_langcode]' => '', + ); + $this->drupalPost('admin/config/regional/language/detection/browser', $edit, t('Save configuration')); + $this->assertText(t('Both browser and Drupal language codes must be provided.'), 'Error message displayed.'); + + // Add a new custom mapping with only a Drupal language code. + $edit = array( + 'mappings[_new][browser_langcode]' => '', + 'mappings[_new][drupal_langcode]' => 'yyyy', + ); + $this->drupalPost('admin/config/regional/language/detection/browser', $edit, t('Save configuration')); + $this->assertText(t('Both browser and Drupal language codes must be provided.'), 'Error message displayed.'); + + // Change browser language code of our custom mapping to zh-sg. + $edit = array( + 'mappings[xx][browser_langcode]' => 'zh-sg', + 'mappings[xx][drupal_langcode]' => 'yy', + ); + $this->drupalPost('admin/config/regional/language/detection/browser', $edit, t('Save configuration')); + $this->assertText(t('Browser language codes must be unique.'), 'Error message displayed.'); + + // Change Drupal language code of our custom mapping to zh-hans-sg. + $edit = array( + 'mappings[xx][browser_langcode]' => 'xx', + 'mappings[xx][drupal_langcode]' => 'zh-hans-sg', + ); + $this->drupalPost('admin/config/regional/language/detection/browser', $edit, t('Save configuration')); + $this->assertField('edit-mappings-xx-browser-langcode', 'xx', 'Browser language code found.'); + $this->assertField('edit-mappings-xx-drupal-langcode', 'zh-hans-sg', 'Drupal language code found.'); + } }