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',