diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc index 041398e..8133899 100644 --- a/core/modules/language/language.admin.inc +++ b/core/modules/language/language.admin.inc @@ -214,47 +214,6 @@ function language_admin_edit_form_submit($form, &$form_state) { } /** - * User interface for the language deletion confirmation screen. - */ -function language_admin_delete_form($form, &$form_state, $language) { - $langcode = $language->id; - - if (language_default()->id == $langcode) { - drupal_set_message(t('The default language cannot be deleted.')); - return new RedirectResponse(url('admin/config/regional/language', array('absolute' => TRUE))); - } - - // For other languages, warn the user that data loss is ahead. - $languages = language_list(); - - if (!isset($languages[$langcode])) { - throw new NotFoundHttpException(); - } - else { - $form['langcode'] = array('#type' => 'value', '#value' => $langcode); - return confirm_form($form, t('Are you sure you want to delete the language %language?', array('%language' => $languages[$langcode]->name)), 'admin/config/regional/language', t('Deleting a language will remove all interface translations associated with it, and posts in this language will be set to be language neutral. This action cannot be undone.'), t('Delete'), t('Cancel')); - } -} - -/** - * Process language deletion submissions. - */ -function language_admin_delete_form_submit($form, &$form_state) { - $langcode = $form_state['values']['langcode']; - $languages = language_list(); - $language = $languages[$langcode]; - - $success = language_delete($langcode); - - if ($success) { - $t_args = array('%language' => $language->name, '%langcode' => $language->id); - drupal_set_message(t('The %language (%langcode) language has been removed.', $t_args)); - } - - $form_state['redirect'] = 'admin/config/regional/language'; -} - -/** * Prepare a language code list for unused predefined languages. */ function language_admin_predefined_list() { @@ -712,31 +671,6 @@ function language_negotiation_configure_browser_form_submit($form, &$form_state) } /** - * Form for deleting a browser language negotiation mapping. - */ -function language_negotiation_configure_browser_delete_form($form, &$form_state, $browser_langcode) { - $form_state['browser_langcode'] = $browser_langcode; - $question = t('Are you sure you want to delete %browser_langcode?', array( - '%browser_langcode' => $browser_langcode, - )); - $path = 'admin/config/regional/language/detection/browser'; - return confirm_form($form, $question, $path, ''); -} - -/** - * Form submit handler to delete a browser language negotiation mapping. - */ -function language_negotiation_configure_browser_delete_form_submit($form, &$form_state) { - $browser_langcode = $form_state['browser_langcode']; - $mappings = language_get_browser_drupal_langcode_mappings(); - if (array_key_exists($browser_langcode, $mappings)) { - unset($mappings[$browser_langcode]); - language_set_browser_drupal_langcode_mappings($mappings); - } - $form_state['redirect'] = 'admin/config/regional/language/detection/browser'; -} - -/** * Returns the content language settings form. */ function language_content_settings_page() { diff --git a/core/modules/language/language.module b/core/modules/language/language.module index 66433d3..11443bb 100644 --- a/core/modules/language/language.module +++ b/core/modules/language/language.module @@ -95,11 +95,7 @@ function language_menu() { ); $items['admin/config/regional/language/delete/%language'] = array( 'title' => 'Confirm delete', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('language_admin_delete_form', 5), - 'access callback' => 'language_access_language_edit_or_delete', - 'access arguments' => array(5), - 'file' => 'language.admin.inc', + 'route_name' => 'language_admin_delete', ); // Language negotiation. @@ -132,10 +128,7 @@ function language_menu() { ); $items['admin/config/regional/language/detection/browser/delete/%'] = array( 'title' => 'Delete language mapping', - 'page arguments' => array('language_negotiation_configure_browser_delete_form', 7), - 'type' => MENU_CALLBACK, - 'access arguments' => array('administer languages'), - 'file' => 'language.admin.inc', + 'route_name' => 'language_negotiation_browser_delete', ); $items['admin/config/regional/language/detection/selected'] = array( 'title' => 'Selected language detection configuration', diff --git a/core/modules/language/language.routing.yml b/core/modules/language/language.routing.yml index e75e1ce..00fb348 100644 --- a/core/modules/language/language.routing.yml +++ b/core/modules/language/language.routing.yml @@ -25,3 +25,17 @@ language_admin_overview: _entity_list: 'language_entity' requirements: _permission: 'administer languages' + +language_admin_delete: + pattern: '/admin/config/regional/language/delete/{language}' + defaults: + _form: '\Drupal\language\Form\AdminDeleteForm' + requirements: + _entity_access: 'language.delete' + +language_negotiation_browser_delete: + pattern: 'admin/config/regional/language/detection/browser/delete/{browser_langcode}' + defaults: + _form: '\Drupal\language\Form\NegotiationBrowserDeleteForm' + requirements: + _permission: 'administer languages' diff --git a/core/modules/language/lib/Drupal/language/Form/AdminDeleteForm.php b/core/modules/language/lib/Drupal/language/Form/AdminDeleteForm.php new file mode 100644 index 0000000..ff4d41a --- /dev/null +++ b/core/modules/language/lib/Drupal/language/Form/AdminDeleteForm.php @@ -0,0 +1,127 @@ +urlGenerator = $url_generator; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('url_generator') + ); + } + + /** + * {@inheritdoc} + */ + public function getQuestion() { + return t('Are you sure you want to delete the language %language?', array('%language' => $this->language->name)); + } + + /** + * {@inheritdoc} + */ + public function getCancelPath() { + return 'admin/config/regional/language'; + } + + /** + * {@inheritdoc} + */ + public function getDescription() { + return t('Deleting a language will remove all interface translations associated with it, and posts in this language will be set to be language neutral. This action cannot be undone.'); + } + + /** + * {@inheritdoc} + */ + public function getConfirmText() { + return t('Delete'); + } + + /** + * {@inheritdoc} + */ + public function getFormID() { + return 'language_admin_delete_form'; + } + + /** + * {@inheritdoc} + */ + public function buildForm(array $form, array &$form_state, $language = NULL, Request $request = NULL) { + $this->language = $language; + + $langcode = $this->language->id; + + if (language_default()->id == $langcode) { + drupal_set_message(t('The default language cannot be deleted.')); + $url = $this->urlGenerator->generateFromPath('admin/config/regional/language', array('absolute' => TRUE)); + + return new RedirectResponse($url); + + } + + // For other languages, warn the user that data loss is ahead. + $languages = language_list(); + if (!isset($languages[$langcode])) { + throw new NotFoundHttpException(); + } + else { + return parent::buildForm($form, $form_state, $request); + } + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + $success = language_delete($this->language->id); + + if ($success) { + $t_args = array('%language' => $this->language->name, '%langcode' => $this->language->id); + drupal_set_message(t('The %language (%langcode) language has been removed.', $t_args)); + } + + $form_state['redirect'] = 'admin/config/regional/language'; + } +} diff --git a/core/modules/language/lib/Drupal/language/Form/NegotiationBrowserDeleteForm.php b/core/modules/language/lib/Drupal/language/Form/NegotiationBrowserDeleteForm.php new file mode 100644 index 0000000..cb159e6 --- /dev/null +++ b/core/modules/language/lib/Drupal/language/Form/NegotiationBrowserDeleteForm.php @@ -0,0 +1,71 @@ + $this->browserLangcode, + )); + } + + /** + * {@inheritdoc} + */ + public function getCancelPath() { + return 'admin/config/regional/language/detection/browser'; + } + + /** + * {@inheritdoc} + */ + public function getFormID() { + return 'language_negotiation_configure_browser_delete_form'; + } + + /** + * {@inheritdoc} + */ + public function buildForm(array $form, array &$form_state, $browser_langcode = NULL, Request $request = NULL) { + $this->browserLangcode = $browser_langcode; + + return parent::buildForm($form, $form_state, $request); + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + $mappings = language_get_browser_drupal_langcode_mappings(); + + if (array_key_exists($this->browserLangcode, $mappings)) { + unset($mappings[$this->browserLangcode]); + language_set_browser_drupal_langcode_mappings($mappings); + } + + $form_state['redirect'] = 'admin/config/regional/language/detection/browser'; + } +} diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageListTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageListTest.php index 4870f57..a33638e 100644 --- a/core/modules/language/lib/Drupal/language/Tests/LanguageListTest.php +++ b/core/modules/language/lib/Drupal/language/Tests/LanguageListTest.php @@ -115,7 +115,7 @@ function testLanguageList() { $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.'); // Verify that language is no longer found. $this->drupalGet('admin/config/regional/language/delete/' . $langcode); - $this->assertResponse(404, 'Language no longer found.'); + $this->assertResponse(403, 'Language no longer found.'); // Make sure the "language_count" state has been updated correctly. drupal_static_reset('language_list'); $languages = language_list(); @@ -132,7 +132,7 @@ function testLanguageList() { $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.'); // Verify that language is no longer found. $this->drupalGet('admin/config/regional/language/delete/fr'); - $this->assertResponse(404, 'Language no longer found.'); + $this->assertResponse(403, 'Language no longer found.'); // Make sure the "language_count" state has not changed. $language_count = $this->container->get('state')->get('language_count') ?: 1; $this->assertEqual($language_count, count($languages), 'Language count is correct.'); diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleTranslationUiTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleTranslationUiTest.php index 167fc6a..05599ea 100644 --- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleTranslationUiTest.php +++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleTranslationUiTest.php @@ -180,7 +180,7 @@ function testStringTranslation() { // Reload to remove $name. $this->drupalGet($path); // Verify that language is no longer found. - $this->assertResponse(404, 'Language no longer found.'); + $this->assertResponse(403, 'Language no longer found.'); $this->drupalLogout(); // Delete the string.