diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc index a7c6663..c2ec185 100644 --- a/core/modules/language/language.admin.inc +++ b/core/modules/language/language.admin.inc @@ -292,47 +292,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() { @@ -747,31 +706,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 bdbd15c..577be22 100644 --- a/core/modules/language/language.module +++ b/core/modules/language/language.module @@ -98,11 +98,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. @@ -135,10 +131,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_configure_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 4a2fc8c..03c519a 100644 --- a/core/modules/language/language.routing.yml +++ b/core/modules/language/language.routing.yml @@ -18,3 +18,17 @@ language_negotiation_selected: _form: 'Drupal\language\Form\NegotiationSelectedForm' requirements: _permission: 'administer languages' + +language_admin_delete: + pattern: '/admin/config/regional/language/delete/{language}' + defaults: + _form: '\Drupal\language\Form\AdminDeleteForm' + requirements: + _access_language_edit_or_delete: 'TRUE' + +language_negotiation_configure_browser_delete: + pattern: 'admin/config/regional/language/detection/browser/delete/{browser_langcode}' + defaults: + _form: '\Drupal\language\Form\NegotiationConfigureBrowserDeleteForm' + requirements: + _permission: 'administer languages' diff --git a/core/modules/language/language.services.yml b/core/modules/language/language.services.yml index d6599b3..48cbd68 100644 --- a/core/modules/language/language.services.yml +++ b/core/modules/language/language.services.yml @@ -5,3 +5,7 @@ services: tags: - { name: path_processor_inbound, priority: 300 } - { name: path_processor_outbound, priority: 100 } + access_check.language.edit_or_delete: + class: Drupal\language\Access\EditOrDeleteAccessCheck + tags: + - { name: access_check } diff --git a/core/modules/language/lib/Drupal/language/Access/EditOrDeleteAccessCheck.php b/core/modules/language/lib/Drupal/language/Access/EditOrDeleteAccessCheck.php new file mode 100644 index 0000000..34dd738 --- /dev/null +++ b/core/modules/language/lib/Drupal/language/Access/EditOrDeleteAccessCheck.php @@ -0,0 +1,36 @@ +getRequirements()); + } + + /** + * {@inheritdoc} + */ + public function access(Route $route, Request $request) { + if ($language = language_load($request->attributes->get('language'))) { + return !$language->locked && user_access('administer languages'); + } + return FALSE; + } +} 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..6f6edd6 --- /dev/null +++ b/core/modules/language/lib/Drupal/language/Form/AdminDeleteForm.php @@ -0,0 +1,128 @@ +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/NegotiationConfigureBrowserDeleteForm.php b/core/modules/language/lib/Drupal/language/Form/NegotiationConfigureBrowserDeleteForm.php new file mode 100644 index 0000000..f6054ce --- /dev/null +++ b/core/modules/language/lib/Drupal/language/Form/NegotiationConfigureBrowserDeleteForm.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 fa718da..515b165 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" variable has been updated correctly. drupal_static_reset('language_list'); $languages = language_list(); @@ -131,7 +131,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" variable has not changed. $this->assertEqual(variable_get('language_count', 1), 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 63ef579..c36c287 100644 --- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleTranslationUiTest.php +++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleTranslationUiTest.php @@ -179,7 +179,7 @@ function testStringTranslation() { // Reload to remove $name. $this->drupalGet($path); // Verify that language is no longer found. - $this->assertResponse(404, t('Language no longer found.')); + $this->assertResponse(403, t('Language no longer found.')); $this->drupalLogout(); // Delete the string.