diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc old mode 100644 new mode 100755 index a3500fd..be158bf --- a/core/modules/language/language.admin.inc +++ b/core/modules/language/language.admin.inc @@ -290,47 +290,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->langcode; - - if (language_default()->langcode == $langcode) { - drupal_set_message(t('The default language cannot be deleted.')); - drupal_goto('admin/config/regional/language'); - } - - // 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->langcode); - 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() { @@ -938,31 +897,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 old mode 100644 new mode 100755 index 1c20695..a53003c --- 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. @@ -138,10 +134,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 new file mode 100755 index 0000000..b7d245b --- /dev/null +++ b/core/modules/language/language.routing.yml @@ -0,0 +1,13 @@ +language_admin_delete: + pattern: '/admin/config/regional/language/delete/{language}' + defaults: + _form: '\Drupal\language\Form\LanguageAdminDeleteForm' + 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\LanguageNegotiationConfigureBrowserDeleteForm' + requirements: + _permission: 'administer languages' \ No newline at end of file diff --git a/core/modules/language/lib/Drupal/language/Access/LanguageEditOrDeleteAccessCheck.php b/core/modules/language/lib/Drupal/language/Access/LanguageEditOrDeleteAccessCheck.php new file mode 100755 index 0000000..9a9a75f --- /dev/null +++ b/core/modules/language/lib/Drupal/language/Access/LanguageEditOrDeleteAccessCheck.php @@ -0,0 +1,36 @@ +getRequirements()); + } + + /** + * Implements AccessCheckInterface::access(). + */ + public function access(Route $route, Request $request) { + if ($language = language_load($request->attributes->get('language'))) { + return !$language->locked && user_access('administer languages'); + } + return FALSE; + } + +} \ No newline at end of file diff --git a/core/modules/language/lib/Drupal/language/Form/LanguageAdminDeleteForm.php b/core/modules/language/lib/Drupal/language/Form/LanguageAdminDeleteForm.php new file mode 100755 index 0000000..fe6adf8 --- /dev/null +++ b/core/modules/language/lib/Drupal/language/Form/LanguageAdminDeleteForm.php @@ -0,0 +1,93 @@ + $this->language->name)); + } + + /** + * {@inheritdoc} + */ + protected function getCancelPath() { + return 'admin/config/regional/language'; + } + + /** + * {@inheritdoc} + */ + protected 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} + */ + protected 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) { + $this->language = language_load($language); + + $langcode = $this->language->langcode; + + if (language_default()->langcode == $langcode) { + drupal_set_message(t('The default language cannot be deleted.')); + drupal_goto('admin/config/regional/language'); + } + + // 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); + } + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + $success = language_delete($this->language->langcode); + + if ($success) { + $t_args = array('%language' => $this->language->name, '%langcode' => $this->language->langcode); + 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/LanguageNegotiationConfigureBrowserDeleteForm.php b/core/modules/language/lib/Drupal/language/Form/LanguageNegotiationConfigureBrowserDeleteForm.php new file mode 100755 index 0000000..285203c --- /dev/null +++ b/core/modules/language/lib/Drupal/language/Form/LanguageNegotiationConfigureBrowserDeleteForm.php @@ -0,0 +1,63 @@ + $this->browserLangcode, + )); + } + + /** + * {@inheritdoc} + */ + protected 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) { + $this->browserLangcode = $browser_langcode; + return parent::buildForm($form, $form_state); + } + + /** + * {@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'; + } +} \ No newline at end of file diff --git a/core/modules/language/lib/Drupal/language/LanguageBundle.php b/core/modules/language/lib/Drupal/language/LanguageBundle.php old mode 100644 new mode 100755 index 1e788aa..a11b894 --- a/core/modules/language/lib/Drupal/language/LanguageBundle.php +++ b/core/modules/language/lib/Drupal/language/LanguageBundle.php @@ -24,6 +24,10 @@ public function build(ContainerBuilder $container) { $container->register('path_processor_language', 'Drupal\language\HttpKernel\PathProcessorLanguage') ->addArgument(new Reference('module_handler')) ->addTag('path_processor_inbound', array('priority' => 300)); + + // Register the language access check. + $container->register('access_check.language.edit_or_delete', 'Drupal\language\Access\LanguageEditOrDeleteAccessCheck') + ->addTag('access_check'); } }