diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc
index 8bac9cf..322f7a2 100644
--- a/core/modules/language/language.admin.inc
+++ b/core/modules/language/language.admin.inc
@@ -5,213 +5,7 @@
* Administration functions for language.module.
*/
-use Drupal\Core\Language\Language;
use Drupal\Core\Language\LanguageManager;
-use Symfony\Component\HttpFoundation\RedirectResponse;
-use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
-
-/**
- * User interface for the language addition screen.
- */
-function language_admin_add_form($form, &$form_state) {
- $predefined_languages = language_admin_predefined_list();
- $predefined_languages['custom'] = t('Custom language...');
- $predefined_default = !empty($form_state['values']['predefined_langcode']) ? $form_state['values']['predefined_langcode'] : key($predefined_languages);
- $form['predefined_langcode'] = array(
- '#type' => 'select',
- '#title' => t('Language name'),
- '#default_value' => $predefined_default,
- '#options' => $predefined_languages,
- );
- $form['predefined_submit'] = array(
- '#type' => 'submit',
- '#value' => t('Add language'),
- '#limit_validation_errors' => array(array('predefined_langcode'), array('predefined_submit')),
- '#states' => array(
- 'invisible' => array(
- 'select#edit-predefined-langcode' => array('value' => 'custom'),
- ),
- ),
- '#validate' => array('language_admin_add_predefined_form_validate'),
- '#submit' => array('language_admin_add_form_submit'),
- );
-
- $form['custom_language'] = array(
- '#type' => 'container',
- '#states' => array(
- 'visible' => array(
- 'select#edit-predefined-langcode' => array('value' => 'custom'),
- ),
- ),
- );
- _language_admin_common_controls($form['custom_language']);
- $form['custom_language']['submit'] = array(
- '#type' => 'submit',
- '#value' => t('Add custom language'),
- '#validate' => array('language_admin_add_custom_form_validate'),
- '#submit' => array('language_admin_add_form_submit'),
- );
-
- return $form;
-}
-
-/**
- * Editing screen for a particular language.
- *
- * @param $langcode
- * Language code of the language to edit.
- */
-function language_admin_edit_form($form, &$form_state, $language) {
- _language_admin_common_controls($form, $language);
- $form['actions'] = array('#type' => 'actions');
- $form['actions']['submit'] = array(
- '#type' => 'submit',
- '#value' => t('Save language')
- );
- $form['#submit'][] = 'language_admin_edit_form_submit';
- $form['#validate'][] = 'language_admin_edit_form_validate';
- return $form;
-}
-
-/**
- * Common elements of the language addition and editing form.
- *
- * @param $form
- * A parent form item (or empty array) to add items below.
- * @param $language
- * Language object to edit.
- */
-function _language_admin_common_controls(&$form, $language = NULL) {
- if (!is_object($language)) {
- $language = new Language(array('id' => NULL, 'name' => NULL,));
- }
- if (isset($language->id)) {
- $form['langcode_view'] = array(
- '#type' => 'item',
- '#title' => t('Language code'),
- '#markup' => $language->id
- );
- $form['langcode'] = array(
- '#type' => 'value',
- '#value' => $language->id
- );
- }
- else {
- $form['langcode'] = array(
- '#type' => 'textfield',
- '#title' => t('Language code'),
- '#maxlength' => 12,
- '#required' => TRUE,
- '#default_value' => '',
- '#disabled' => FALSE,
- '#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/')),
- );
- }
- $form['name'] = array(
- '#type' => 'textfield',
- '#title' => t('Language name in English'),
- '#maxlength' => 64,
- '#default_value' => @$language->name,
- '#required' => TRUE,
- );
- $form['direction'] = array(
- '#type' => 'radios',
- '#title' => t('Direction'),
- '#required' => TRUE,
- '#description' => t('Direction that text in this language is presented.'),
- '#default_value' => @$language->direction,
- '#options' => array(Language::DIRECTION_LTR => t('Left to right'), Language::DIRECTION_RTL => t('Right to left')),
- );
- return $form;
-}
-
-/**
- * Element specific validator for the Add language button.
- */
-function language_admin_add_predefined_form_validate($form, &$form_state) {
- $langcode = $form_state['values']['predefined_langcode'];
- if ($langcode == 'custom') {
- form_set_error('predefined_langcode', t('Fill in the language details and save the language with Add custom language.'));
- }
- else {
- if ($language = language_load($langcode)) {
- form_set_error('predefined_langcode', t('The language %language (%langcode) already exists.', array('%language' => $language->name, '%langcode' => $langcode)));
- }
- }
-}
-
-/**
- * Validate the language addition form on custom language button.
- */
-function language_admin_add_custom_form_validate($form, &$form_state) {
- if ($form_state['values']['predefined_langcode'] == 'custom') {
- $langcode = $form_state['values']['langcode'];
- // Reuse the editing form validation routine if we add a custom language.
- language_admin_edit_form_validate($form['custom_language'], $form_state);
-
- if ($language = language_load($langcode)) {
- form_set_error('langcode', t('The language %language (%langcode) already exists.', array('%language' => $language->name, '%langcode' => $langcode)));
- }
- }
- else {
- form_set_error('predefined_langcode', t('Use the Add language button to save a predefined language.'));
- }
-}
-
-/**
- * Process the custom and predefined language addition form submission.
- */
-function language_admin_add_form_submit($form, &$form_state) {
- $langcode = $form_state['values']['predefined_langcode'];
- if ($langcode == 'custom') {
- $langcode = $form_state['values']['langcode'];
- // Custom language form.
- $language = new Language(array(
- 'id' => $langcode,
- 'name' => $form_state['values']['name'],
- 'direction' => $form_state['values']['direction'],
- ));
- }
- else {
- $language = new Language(array('id' => $langcode));
- }
- // Save the language and inform the user that it happened.
- $language = language_save($language);
- drupal_set_message(t('The language %language has been created and can now be used.', array('%language' => $language->name)));
-
- // Tell the user they have the option to add a language switcher block
- // to their theme so they can switch between the languages.
- drupal_set_message(t('Use one of the language switcher blocks to allow site visitors to switch between languages. You can enable these blocks on the block administration page.', array('@block-admin' => url('admin/structure/block'))));
-
- $form_state['redirect'] = 'admin/config/regional/language';
-}
-
-/**
- * Validate the language editing form. Reused for custom language addition too.
- */
-function language_admin_edit_form_validate($form, &$form_state) {
- // Ensure sane field values for langcode and name.
- if (!isset($form['langcode_view']) && preg_match('@[^a-zA-Z_-]@', $form_state['values']['langcode'])) {
- form_set_error('langcode', t('%field may only contain characters a-z, underscores, or hyphens.', array('%field' => $form['langcode']['#title'])));
- }
- if ($form_state['values']['name'] != check_plain($form_state['values']['name'])) {
- form_set_error('name', t('%field cannot contain any markup.', array('%field' => $form['name']['#title'])));
- }
-}
-
-/**
- * Process the language editing form submission.
- */
-function language_admin_edit_form_submit($form, &$form_state) {
- // Prepare a language object for saving.
- $languages = language_list();
- $langcode = $form_state['values']['langcode'];
- $language = $languages[$langcode];
- $language->name = $form_state['values']['name'];
- $language->direction = $form_state['values']['direction'];
- language_save($language);
- $form_state['redirect'] = 'admin/config/regional/language';
-}
/**
* Prepare a language code list for unused predefined languages.
diff --git a/core/modules/language/language.local_actions.yml b/core/modules/language/language.local_actions.yml
new file mode 100644
index 0000000..32c143d
--- /dev/null
+++ b/core/modules/language/language.local_actions.yml
@@ -0,0 +1,5 @@
+language_add_local_action:
+ route_name: language_add
+ title: 'Add language'
+ appears_on:
+ - language_admin_overview
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index 2dd5e57..1899d72 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -78,20 +78,12 @@ function language_menu() {
'type' => MENU_DEFAULT_LOCAL_TASK,
);
$items['admin/config/regional/language/add'] = array(
- 'title' => 'Add language',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('language_admin_add_form'),
- 'access arguments' => array('administer languages'),
- 'type' => MENU_LOCAL_ACTION,
- 'file' => 'language.admin.inc',
+ 'route_name' => 'language_add',
+ 'type' => MENU_SIBLING_LOCAL_TASK,
);
$items['admin/config/regional/language/edit/%language'] = array(
'title' => 'Edit language',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('language_admin_edit_form', 5),
- 'access callback' => 'language_access_language_edit_or_delete',
- 'access arguments' => array(5),
- 'file' => 'language.admin.inc',
+ 'route_name' => 'language_edit',
);
$items['admin/config/regional/language/delete/%language'] = array(
'route_name' => 'language_delete',
diff --git a/core/modules/language/language.routing.yml b/core/modules/language/language.routing.yml
index 5158655..9fd2802 100644
--- a/core/modules/language/language.routing.yml
+++ b/core/modules/language/language.routing.yml
@@ -19,6 +19,20 @@ language_negotiation_selected:
requirements:
_permission: 'administer languages'
+language_add:
+ pattern: '/admin/config/regional/language/add'
+ defaults:
+ _entity_form: 'language_entity.add'
+ requirements:
+ _entity_create_access: 'language_entity'
+
+language_edit:
+ pattern: '/admin/config/regional/language/edit/{language_entity}'
+ defaults:
+ _entity_form: 'language_entity.edit'
+ requirements:
+ _entity_access: 'language_entity.update'
+
language_admin_overview:
pattern: '/admin/config/regional/language'
defaults:
diff --git a/core/modules/language/lib/Drupal/language/Entity/Language.php b/core/modules/language/lib/Drupal/language/Entity/Language.php
index 23f65db..c145f25 100644
--- a/core/modules/language/lib/Drupal/language/Entity/Language.php
+++ b/core/modules/language/lib/Drupal/language/Entity/Language.php
@@ -26,6 +26,8 @@
* "list" = "Drupal\language\LanguageListController",
* "access" = "Drupal\language\LanguageAccessController",
* "form" = {
+ * "add" = "Drupal\language\Form\LanguageAddForm",
+ * "edit" = "Drupal\language\Form\LanguageEditForm",
* "delete" = "Drupal\language\Form\LanguageDeleteForm"
* }
* },
diff --git a/core/modules/language/lib/Drupal/language/Form/LanguageAddForm.php b/core/modules/language/lib/Drupal/language/Form/LanguageAddForm.php
new file mode 100644
index 0000000..ccc833c
--- /dev/null
+++ b/core/modules/language/lib/Drupal/language/Form/LanguageAddForm.php
@@ -0,0 +1,143 @@
+t('Add language');
+
+ $this->moduleHandler->loadInclude('language', 'inc', 'language.admin');
+ $predefined_languages = language_admin_predefined_list();
+
+ $predefined_languages['custom'] = $this->t('Custom language...');
+ $predefined_default = !empty($form_state['values']['predefined_langcode']) ? $form_state['values']['predefined_langcode'] : key($predefined_languages);
+ $form['predefined_langcode'] = array(
+ '#type' => 'select',
+ '#title' => $this->t('Language name'),
+ '#default_value' => $predefined_default,
+ '#options' => $predefined_languages,
+ );
+ $form['predefined_submit'] = array(
+ '#type' => 'submit',
+ '#value' => $this->t('Add language'),
+ '#limit_validation_errors' => array(array('predefined_langcode'), array('predefined_submit')),
+ '#states' => array(
+ 'invisible' => array(
+ 'select#edit-predefined-langcode' => array('value' => 'custom'),
+ ),
+ ),
+ '#validate' => array(array($this, 'validatePredefined')),
+ '#submit' => array(array($this, 'submitForm')),
+ );
+
+ $form['custom_language'] = array(
+ '#type' => 'container',
+ '#states' => array(
+ 'visible' => array(
+ 'select#edit-predefined-langcode' => array('value' => 'custom'),
+ ),
+ ),
+ );
+ $this->commonForm($form['custom_language']);
+ $form['custom_language']['submit'] = array(
+ '#type' => 'submit',
+ '#value' => $this->t('Add custom language'),
+ '#validate' => array(array($this, 'validateCustom')),
+ '#submit' => array(array($this, 'submitForm')),
+ );
+
+ return $form;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function submitForm(array &$form, array &$form_state) {
+ $langcode = $form_state['values']['predefined_langcode'];
+ if ($langcode == 'custom') {
+ $langcode = $form_state['values']['langcode'];
+ // Custom language form.
+ $language = new Language(array(
+ 'id' => $langcode,
+ 'name' => $form_state['values']['name'],
+ 'direction' => $form_state['values']['direction'],
+ ));
+ }
+ else {
+ $language = new Language(array('id' => $langcode));
+ }
+ // Save the language and inform the user that it happened.
+ $language = language_save($language);
+ drupal_set_message($this->t('The language %language has been created and can now be used.', array('%language' => $language->name)));
+
+ // Tell the user they have the option to add a language switcher block
+ // to their theme so they can switch between the languages.
+ drupal_set_message($this->t('Use one of the language switcher blocks to allow site visitors to switch between languages. You can enable these blocks on the block administration page.', array('@block-admin' => url('admin/structure/block'))));
+ $form_state['redirect'] = 'admin/config/regional/language';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function actions(array $form, array &$form_state) {
+ // No actions needed.
+ return array();
+ }
+
+ /**
+ * Validates the language addition form on custom language button.
+ */
+ public function validateCustom(array $form, array &$form_state) {
+ if ($form_state['values']['predefined_langcode'] == 'custom') {
+ $langcode = $form_state['values']['langcode'];
+ // Reuse the editing form validation routine if we add a custom language.
+ $this->validateCommon($form['custom_language'], $form_state);
+
+ if ($language = language_load($langcode)) {
+ form_error($form['custom_language']['langcode'], $this->t('The language %language (%langcode) already exists.', array('%language' => $language->name, '%langcode' => $langcode)));
+ }
+ }
+ else {
+ form_error($form['predefined_langcode'], $this->t('Use the Add language button to save a predefined language.'));
+ }
+ }
+
+ /**
+ * Element specific validator for the Add language button.
+ */
+ public function validatePredefined($form, &$form_state) {
+ $langcode = $form_state['values']['predefined_langcode'];
+ if ($langcode == 'custom') {
+ form_error($form['predefined_langcode'], $this->t('Fill in the language details and save the language with Add custom language.'));
+ }
+ else {
+ if ($language = language_load($langcode)) {
+ form_error($form['predefined_langcode'], $this->t('The language %language (%langcode) already exists.', array('%language' => $language->name, '%langcode' => $langcode)));
+ }
+ }
+ }
+
+}
diff --git a/core/modules/language/lib/Drupal/language/Form/LanguageEditForm.php b/core/modules/language/lib/Drupal/language/Form/LanguageEditForm.php
new file mode 100644
index 0000000..9d8b6aa
--- /dev/null
+++ b/core/modules/language/lib/Drupal/language/Form/LanguageEditForm.php
@@ -0,0 +1,60 @@
+commonForm($form);
+ return parent::form($form, $form_state);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function actions(array $form, array &$form_state) {
+ $actions['submit'] = array(
+ '#type' => 'submit',
+ '#value' => $this->t('Save language'),
+ '#validate' => array(array($this, 'validateCommon')),
+ '#submit' => array(array($this, 'submitForm')),
+ );
+ return $actions;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function submitForm(array &$form, array &$form_state) {
+ // Prepare a language object for saving.
+ $languages = language_list();
+ $langcode = $form_state['values']['langcode'];
+ $language = $languages[$langcode];
+ $language->name = $form_state['values']['name'];
+ $language->direction = $form_state['values']['direction'];
+ language_save($language);
+ $form_state['redirect'] = 'admin/config/regional/language';
+ }
+
+}
diff --git a/core/modules/language/lib/Drupal/language/Form/LanguageFormBase.php b/core/modules/language/lib/Drupal/language/Form/LanguageFormBase.php
new file mode 100644
index 0000000..b6d43ec
--- /dev/null
+++ b/core/modules/language/lib/Drupal/language/Form/LanguageFormBase.php
@@ -0,0 +1,80 @@
+entity;
+ if (isset($language->id)) {
+ $form['langcode_view'] = array(
+ '#type' => 'item',
+ '#title' => $this->t('Language code'),
+ '#markup' => $language->id
+ );
+ $form['langcode'] = array(
+ '#type' => 'value',
+ '#value' => $language->id
+ );
+ }
+ else {
+ $form['langcode'] = array(
+ '#type' => 'textfield',
+ '#title' => $this->t('Language code'),
+ '#maxlength' => 12,
+ '#required' => TRUE,
+ '#default_value' => '',
+ '#disabled' => FALSE,
+ '#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/')),
+ );
+ }
+ $form['name'] = array(
+ '#type' => 'textfield',
+ '#title' => $this->t('Language name in English'),
+ '#maxlength' => 64,
+ '#default_value' => $language->label,
+ '#required' => TRUE,
+ );
+ $form['direction'] = array(
+ '#type' => 'radios',
+ '#title' => $this->t('Direction'),
+ '#required' => TRUE,
+ '#description' => $this->t('Direction that text in this language is presented.'),
+ '#default_value' => $language->direction,
+ '#options' => array(
+ Language::DIRECTION_LTR => $this->t('Left to right'),
+ Language::DIRECTION_RTL => $this->t('Right to left'),
+ ),
+ );
+
+ return $form;
+ }
+
+ /**
+ * Validates the language editing element.
+ */
+ public function validateCommon(array $form, array &$form_state) {
+ // Ensure sane field values for langcode and name.
+ if (!isset($form['langcode_view']) && preg_match('@[^a-zA-Z_-]@', $form_state['values']['langcode'])) {
+ form_error($form['langcode'], $this->t('%field may only contain characters a-z, underscores, or hyphens.', array('%field' => $form['langcode']['#title'])));
+ }
+ if ($form_state['values']['name'] != check_plain($form_state['values']['name'])) {
+ form_error($form['name'], $this->t('%field cannot contain any markup.', array('%field' => $form['name']['#title'])));
+ }
+ }
+
+}
diff --git a/core/modules/language/lib/Drupal/language/LanguageAccessController.php b/core/modules/language/lib/Drupal/language/LanguageAccessController.php
index e201dec..1609dd0 100644
--- a/core/modules/language/lib/Drupal/language/LanguageAccessController.php
+++ b/core/modules/language/lib/Drupal/language/LanguageAccessController.php
@@ -19,7 +19,6 @@ class LanguageAccessController extends EntityAccessController {
*/
public function access(EntityInterface $entity, $operation, $langcode = Language::LANGCODE_DEFAULT, AccountInterface $account = NULL) {
switch ($operation) {
- case 'create':
case 'update':
case 'delete':
return !$entity->locked && user_access('administer languages');
@@ -28,4 +27,11 @@ public function access(EntityInterface $entity, $operation, $langcode = Language
return FALSE;
}
+ /**
+ * {@inheritdoc}
+ */
+ protected function checkCreateAccess(AccountInterface $account, array $context, $entity_bundle = NULL) {
+ return $account->hasPermission('administer languages');
+ }
+
}
diff --git a/core/modules/language/lib/Drupal/language/LanguageInterface.php b/core/modules/language/lib/Drupal/language/LanguageInterface.php
index 20ca26c..b2bfe26 100644
--- a/core/modules/language/lib/Drupal/language/LanguageInterface.php
+++ b/core/modules/language/lib/Drupal/language/LanguageInterface.php
@@ -2,7 +2,7 @@
/**
* @file
- * Contains \Drupal\language\Entity\LanguageInterface.
+ * Contains \Drupal\language\LanguageInterface.
*/
namespace Drupal\language;
diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module
index 72070f8..1b34406 100644
--- a/core/modules/locale/locale.module
+++ b/core/modules/locale/locale.module
@@ -819,7 +819,7 @@ function locale_form_language_admin_edit_form_alter(&$form, &$form_state) {
'#type' => 'checkbox',
'#default_value' => locale_translate_english(),
);
- $form['#submit'][] = 'locale_form_language_admin_edit_form_alter_submit';
+ $form['actions']['submit']['#submit'][] = 'locale_form_language_admin_edit_form_alter_submit';
}
}