diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc
index 8bac9cf5999..757b3512d78 100644
--- a/core/modules/language/language.admin.inc
+++ b/core/modules/language/language.admin.inc
@@ -489,86 +489,6 @@ function language_negotiation_configure_form_submit($form, &$form_state) {
drupal_set_message(t('Language negotiation configuration saved.'));
}
-/**
- * Builds the browser language negotiation method configuration form.
- */
-function language_negotiation_configure_browser_form($form, &$form_state) {
- $form = array();
-
- // Initialize a language list to the ones available, including English.
- $languages = language_list();
-
- $existing_languages = array();
- foreach ($languages as $langcode => $language) {
- $existing_languages[$langcode] = $language->name;
- }
-
- // If we have no languages available, present the list of predefined languages
- // only. If we do have already added languages, set up two option groups with
- // the list of existing and then predefined languages.
- if (empty($existing_languages)) {
- $language_options = language_admin_predefined_list();
- }
- else {
- $language_options = array(
- t('Existing languages') => $existing_languages,
- t('Languages not yet added') => language_admin_predefined_list()
- );
- }
-
- $form['mappings'] = array(
- '#tree' => TRUE,
- '#theme' => 'language_negotiation_configure_browser_form_table',
- );
-
- $mappings = language_get_browser_drupal_langcode_mappings();
- foreach ($mappings as $browser_langcode => $drupal_langcode) {
- $form['mappings'][$browser_langcode] = array(
- 'browser_langcode' => array(
- '#type' => 'textfield',
- '#default_value' => $browser_langcode,
- '#size' => 20,
- '#required' => TRUE,
- ),
- 'drupal_langcode' => array(
- '#type' => 'select',
- '#options' => $language_options,
- '#default_value' => $drupal_langcode,
- '#required' => TRUE,
- ),
- );
- }
-
- // Add empty row.
- $form['new_mapping'] = array(
- '#type' => 'details',
- '#title' => t('Add a new mapping'),
- '#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 language'),
- '#options' => $language_options,
- '#default_value' => '',
- );
-
- $form['actions']['#type'] = 'actions';
- $form['actions']['submit'] = array(
- '#type' => 'submit',
- '#value' => t('Save configuration'),
- );
-
- return $form;
-}
-
/**
* Theme browser configuration form as table.
*
@@ -620,56 +540,6 @@ function theme_language_negotiation_configure_browser_form_table($variables) {
return $output;
}
-/**
- * Browser language negotiation form validation.
- */
-function language_negotiation_configure_browser_form_validate($form, &$form_state) {
- // Array to check if all browser language codes are unique.
- $unique_values = array();
-
- // 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', t('Browser language codes must be unique.'));
- }
- elseif (preg_match('/[^a-z\-]/', $data['browser_langcode'])) {
- form_set_error('mappings][' . $key . '][browser_langcode', t('Browser language codes can only contain lowercase letters and a hyphen(-).'));
- }
- $unique_values[$data['browser_langcode']] = $data['drupal_langcode'];
- }
- }
-
- // 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', t('Browser language codes must be unique.'));
- }
- elseif (preg_match('/[^a-z\-]/', $data['browser_langcode'])) {
- form_set_error('mappings][' . $key . '][browser_langcode', t('Browser language codes can only contain lowercase letters and a hyphen(-).'));
- }
- $unique_values[$data['browser_langcode']] = $data['drupal_langcode'];
- }
-
- $form_state['mappings'] = $unique_values;
-}
-
-/**
- * Browser language negotiation form submit.
- */
-function language_negotiation_configure_browser_form_submit($form, &$form_state) {
- $mappings = $form_state['mappings'];
- if (!empty($mappings)) {
- language_set_browser_drupal_langcode_mappings($mappings);
- }
- $form_state['redirect'] = 'admin/config/regional/language/detection';
-}
-
/**
* Returns the content language settings form.
*/
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index 2dd5e57faca..26ebfe6b010 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -119,10 +119,7 @@ function language_menu() {
);
$items['admin/config/regional/language/detection/browser'] = array(
'title' => 'Browser language detection configuration',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('language_negotiation_configure_browser_form'),
- 'access arguments' => array('administer languages'),
- 'file' => 'language.admin.inc',
+ 'route_name' => 'language_negotiation_browser',
'type' => MENU_VISIBLE_IN_BREADCRUMB,
);
$items['admin/config/regional/language/detection/selected'] = array(
diff --git a/core/modules/language/language.routing.yml b/core/modules/language/language.routing.yml
index 51586550966..a3991df3574 100644
--- a/core/modules/language/language.routing.yml
+++ b/core/modules/language/language.routing.yml
@@ -33,6 +33,14 @@ language_delete:
requirements:
_entity_access: 'language_entity.delete'
+language_negotiation_browser:
+ pattern: '/admin/config/regional/language/detection/browser'
+ defaults:
+ _form: '\Drupal\language\Form\NegotiationBrowserForm'
+ _title: 'Browser language detection configuration'
+ requirements:
+ _permission: 'administer languages'
+
language_negotiation_browser_delete:
pattern: 'admin/config/regional/language/detection/browser/delete/{browser_langcode}'
defaults:
diff --git a/core/modules/language/lib/Drupal/language/Form/NegotiationBrowserForm.php b/core/modules/language/lib/Drupal/language/Form/NegotiationBrowserForm.php
new file mode 100644
index 00000000000..c7555c31df6
--- /dev/null
+++ b/core/modules/language/lib/Drupal/language/Form/NegotiationBrowserForm.php
@@ -0,0 +1,200 @@
+moduleHandler = $module_handler;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(ContainerInterface $container) {
+ return new static(
+ $container->get('config.factory'),
+ $container->get('config.context.free'),
+ $container->get('module_handler')
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getFormID() {
+ return 'language_negotiation_configure_browser_form';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function buildForm(array $form, array &$form_state) {
+ $this->moduleHandler->loadInclude('language', 'inc', 'language.admin');
+ $form = array();
+
+ // Initialize a language list to the ones available, including English.
+ $languages = language_list();
+
+ $existing_languages = array();
+ foreach ($languages as $langcode => $language) {
+ $existing_languages[$langcode] = $language->name;
+ }
+
+ // If we have no languages available, present the list of predefined languages
+ // only. If we do have already added languages, set up two option groups with
+ // the list of existing and then predefined languages.
+ if (empty($existing_languages)) {
+ $language_options = language_admin_predefined_list();
+ }
+ else {
+ $language_options = array(
+ $this->t('Existing languages') => $existing_languages,
+ $this->t('Languages not yet added') => language_admin_predefined_list()
+ );
+ }
+
+ $form['mappings'] = array(
+ '#tree' => TRUE,
+ '#theme' => 'language_negotiation_configure_browser_form_table',
+ );
+
+ $mappings = $this->language_get_browser_drupal_langcode_mappings();
+ foreach ($mappings as $browser_langcode => $drupal_langcode) {
+ $form['mappings'][$browser_langcode] = array(
+ 'browser_langcode' => array(
+ '#type' => 'textfield',
+ '#default_value' => $browser_langcode,
+ '#size' => 20,
+ '#required' => TRUE,
+ ),
+ 'drupal_langcode' => array(
+ '#type' => 'select',
+ '#options' => $language_options,
+ '#default_value' => $drupal_langcode,
+ '#required' => TRUE,
+ ),
+ );
+ }
+
+ // Add empty row.
+ $form['new_mapping'] = array(
+ '#type' => 'details',
+ '#title' => $this->t('Add a new mapping'),
+ '#collapsed' => TRUE,
+ '#tree' => TRUE,
+ );
+ $form['new_mapping']['browser_langcode'] = array(
+ '#type' => 'textfield',
+ '#title' => $this->t('Browser language code'),
+ '#description' => $this->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' => $this->t('Drupal language'),
+ '#options' => $language_options,
+ '#default_value' => '',
+ );
+
+ return parent::buildForm($form, $form_state);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function validateForm(array &$form, array &$form_state) {
+ // Array to check if all browser language codes are unique.
+ $unique_values = array();
+
+ // 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', $this->t('Browser language codes must be unique.'));
+ }
+ elseif (preg_match('/[^a-z\-]/', $data['browser_langcode'])) {
+ form_set_error('mappings][' . $key . '][browser_langcode', $this->t('Browser language codes can only contain lowercase letters and a hyphen(-).'));
+ }
+ $unique_values[$data['browser_langcode']] = $data['drupal_langcode'];
+ }
+ }
+
+ // 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', $this->t('Browser language codes must be unique.'));
+ }
+ elseif (preg_match('/[^a-z\-]/', $data['browser_langcode'])) {
+ form_set_error('mappings][' . $key . '][browser_langcode', $this->t('Browser language codes can only contain lowercase letters and a hyphen(-).'));
+ }
+ $unique_values[$data['browser_langcode']] = $data['drupal_langcode'];
+ }
+
+ $form_state['mappings'] = $unique_values;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function submitForm(array &$form, array &$form_state) {
+ $mappings = $form_state['mappings'];
+ if (!empty($mappings)) {
+ $config = $this->configFactory->get('language.mappings');
+ $config->setData($mappings);
+ $config->save();
+ }
+ $form_state['redirect'] = 'admin/config/regional/language/detection';
+
+ parent::submitForm($form, $form_state);
+ }
+
+ /**
+ * Retrieves the browser's langcode mapping configuration array.
+ *
+ * @return array
+ * The browser's langcode mapping configuration array.
+ */
+ protected function language_get_browser_drupal_langcode_mappings() {
+ $config = $this->configFactory->get('language.mappings');
+ if ($config->isNew()) {
+ return array();
+ }
+ return $config->get();
+ }
+
+}