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 @@ -869,17 +869,25 @@ } // Add empty row. - $form['mappings']['_new'] = array( - 'browser_langcode' => array( - '#type' => 'textfield', - '#default_value' => '', - '#size' => 20, - ), - 'drupal_langcode' => array( - '#type' => 'select', - '#options' => $language_options, - '#default_value' => '', - ), + $form['new_mapping'] = array( + '#type' => 'fieldset', + '#title' => t('Add a new mapping'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + '#tree' => TRUE, + ); + $form['new_mapping']['browser_langcode'] = array( + '#type' => 'textfield', + '#title' => t('Browser language code'), + '#description' => t('Use language codes as defined by the W3C for interoperability. Examples: "en", "en-gb" and "zh-hant".', array('@w3ctags' => 'http://www.w3.org/International/articles/language-tags/')), + '#default_value' => '', + '#size' => 20, + ); + $form['new_mapping']['drupal_langcode'] = array( + '#type' => 'select', + '#title' => t('Drupal langauge'), + '#options' => $language_options, + '#default_value' => '', ); $form_state['redirect'] = 'admin/config/regional/language/detection'; @@ -914,13 +922,8 @@ $row = array(); $row[] = drupal_render($form[$key]['browser_langcode']); $row[] = drupal_render($form[$key]['drupal_langcode']); + $row[] = l(t('Delete'), 'admin/config/regional/language/detection/browser/delete/' . $key, $link_attributes); - if ($key != '_new') { - $row[] = l(t('Delete'), 'admin/config/regional/language/detection/browser/delete/' . $key, $link_attributes); - } - else { - $row[] = ''; - } $rows[] = array( 'data' => $row, ); @@ -941,42 +944,38 @@ * Browser language negotiation form validation. */ function language_negotiation_configure_browser_form_validate($form, &$form_state) { - $mappings = $form_state['values']['mappings']; + // Array to check if all browser language codes are unique. $unique_values = array(); - foreach ($mappings as $key => $data) { - if ($key == '_new') { - if (!empty($data['browser_langcode']) && !empty($data['drupal_langcode'])) { - // Make sure browser_langcode is unique. - if (array_key_exists($data['browser_langcode'], $unique_values)) { - form_set_error('mappings][' . $key . '][browser_langcode', 'Browser language codes must be unique.'); - } - elseif (preg_match('/[^a-z\-]/', $data['browser_langcode'])) { - form_set_error('mappings][' . $key . '][browser_langcode', 'Browser language codes can only contain lowercase letters and a hyphen(-).'); - } - $unique_values[$data['browser_langcode']] = $data['drupal_langcode']; + + // Check all mappings. + $mappings = array(); + if (isset($form_state['values']['mappings'])) { + $mappings = $form_state['values']['mappings']; + foreach ($mappings as $key => $data) { + // Make sure browser_langcode is unique. + if (array_key_exists($data['browser_langcode'], $unique_values)) { + form_set_error('mappings][' . $key . '][browser_langcode', 'Browser language codes must be unique.'); } - elseif (empty($data['browser_langcode']) xor empty($data['drupal_langcode'])) { - form_set_error('mappings][' . $key . '][drupal_langcode', 'Both browser language code and Drupal language must be provided.'); + elseif (preg_match('/[^a-z\-]/', $data['browser_langcode'])) { + form_set_error('mappings][' . $key . '][browser_langcode', 'Browser language codes can only contain lowercase letters and a hyphen(-).'); } + $unique_values[$data['browser_langcode']] = $data['drupal_langcode']; } - else { - if (!empty($data['browser_langcode']) && !empty($data['drupal_langcode'])) { - // Make sure browser_langcode is unique. - if (array_key_exists($data['browser_langcode'], $unique_values)) { - form_set_error('mappings][' . $key . '][browser_langcode', 'Browser language codes must be unique.'); - } - elseif (preg_match('/[^a-z\-]/', $data['browser_langcode'])) { - form_set_error('mappings][' . $key . '][browser_langcode', 'Browser language codes can only contain lowercase letters and a hyphen(-).'); - } - $unique_values[$data['browser_langcode']] = $data['drupal_langcode']; - } - else { - if (empty($data['browser_langcode'])) { - form_set_error('mappings][' . $key . '][browser_langcode', 'Browser language code cannot be blank.'); - } - } + } + + // Check new mapping. + $data = $form_state['values']['new_mapping']; + if (!empty($data['browser_langcode'])) { + // Make sure browser_langcode is unique. + if (array_key_exists($data['browser_langcode'], $unique_values)) { + form_set_error('mappings][' . $key . '][browser_langcode', 'Browser language codes must be unique.'); + } + elseif (preg_match('/[^a-z\-]/', $data['browser_langcode'])) { + form_set_error('mappings][' . $key . '][browser_langcode', 'Browser language codes can only contain lowercase letters and a hyphen(-).'); } + $unique_values[$data['browser_langcode']] = $data['drupal_langcode']; } + $form_state['mappings'] = $unique_values; } 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 @@ -195,8 +195,8 @@ // Add a new custom mapping. $edit = array( - 'mappings[_new][browser_langcode]' => 'xx', - 'mappings[_new][drupal_langcode]' => 'en', + 'new_mapping[browser_langcode]' => 'xx', + 'new_mapping[drupal_langcode]' => 'en', ); $this->drupalPost('admin/config/regional/language/detection/browser', $edit, t('Save configuration')); $this->assertField('edit-mappings-xx-browser-langcode', 'xx', 'Browser language code found.'); @@ -206,14 +206,6 @@ $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 Drupal language code. - $edit = array( - 'mappings[_new][browser_langcode]' => '', - 'mappings[_new][drupal_langcode]' => 'en', - ); - $this->drupalPost('admin/config/regional/language/detection/browser', $edit, t('Save configuration')); - $this->assertText(t('Both browser language code and Drupal language 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',