diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc
index 041398e..efa40b1 100644
--- a/core/modules/language/language.admin.inc
+++ b/core/modules/language/language.admin.inc
@@ -56,24 +56,6 @@ function language_admin_add_form($form, &$form_state) {
}
/**
- * 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
@@ -141,24 +123,6 @@ function language_admin_add_predefined_form_validate($form, &$form_state) {
}
/**
- * 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) {
@@ -200,20 +164,6 @@ function language_admin_edit_form_validate($form, &$form_state) {
}
/**
- * 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';
-}
-
-/**
* User interface for the language deletion confirmation screen.
*/
function language_admin_delete_form($form, &$form_state, $language) {
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index 9674630..164f741 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -85,14 +85,6 @@ function language_menu() {
'type' => MENU_LOCAL_ACTION,
'file' => 'language.admin.inc',
);
- $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',
- );
$items['admin/config/regional/language/delete/%language'] = array(
'title' => 'Confirm delete',
'page callback' => 'drupal_get_form',
diff --git a/core/modules/language/language.routing.yml b/core/modules/language/language.routing.yml
index e75e1ce..a6d0c1d 100644
--- a/core/modules/language/language.routing.yml
+++ b/core/modules/language/language.routing.yml
@@ -25,3 +25,10 @@ language_admin_overview:
_entity_list: 'language_entity'
requirements:
_permission: 'administer languages'
+
+language_admin_edit_form:
+ pattern: '/admin/config/regional/language/edit/{language_entity}'
+ defaults:
+ _entity_form: 'language_entity.edit'
+ requirements:
+ _permission: 'administer languages'
diff --git a/core/modules/language/lib/Drupal/language/LanguageFormController.php b/core/modules/language/lib/Drupal/language/LanguageFormController.php
new file mode 100644
index 0000000..15fba1c
--- /dev/null
+++ b/core/modules/language/lib/Drupal/language/LanguageFormController.php
@@ -0,0 +1,106 @@
+entity;
+
+ if ($this->operation == 'edit') {
+ drupal_set_title(t('Edit language'));
+ }
+
+ if (isset($language_entity->id)) {
+ $form['langcode_view'] = array(
+ '#type' => 'item',
+ '#title' => t('Language code'),
+ '#markup' => $language_entity->id()
+ );
+ $form['langcode'] = array(
+ '#type' => 'value',
+ '#value' => $language_entity->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['label'] = array(
+ '#type' => 'textfield',
+ '#title' => t('Language name in English'),
+ '#maxlength' => 64,
+ '#default_value' => $language_entity->label,
+ '#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_entity->direction,
+ '#options' => array(
+ Language::DIRECTION_LTR => t('Left to right'),
+ Language::DIRECTION_RTL => t('Right to left')
+ ),
+ );
+
+ return $form;
+ }
+
+ protected function actions(array $form, array &$form_state) {
+ $actions = parent::actions($form, $form_state);;
+ $actions['submit']['#value'] = t('Save language');
+ return $actions;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function validateForm(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_set_error('langcode', t('%field may only contain characters a-z, underscores, or hyphens.', array('%field' => $form['langcode']['#title'])));
+ }
+ if ($form_state['values']['label'] != check_plain($form_state['values']['label'])) {
+ form_set_error('label', t('%field cannot contain any markup.', array('%field' => $form['label']['#title'])));
+ }
+ }
+
+ /**
+ * Overrides Drupal\Core\Entity\EntityFormController::save().
+ */
+ public function save(array $form, array &$form_state) {
+ $language_entity = $this->entity;
+
+ // Prevent leading and trailing spaces in language names.
+ $language_entity->label = trim($language_entity->label);
+ $language_entity->save();
+
+ $form_state['redirect'] = 'admin/config/regional/language';
+ }
+}
diff --git a/core/modules/language/lib/Drupal/language/Plugin/Core/Entity/Language.php b/core/modules/language/lib/Drupal/language/Plugin/Core/Entity/Language.php
index 4f71f3e..a8ebc0e 100644
--- a/core/modules/language/lib/Drupal/language/Plugin/Core/Entity/Language.php
+++ b/core/modules/language/lib/Drupal/language/Plugin/Core/Entity/Language.php
@@ -24,7 +24,11 @@
* controllers = {
* "storage" = "Drupal\Core\Config\Entity\ConfigStorageController",
* "list" = "Drupal\language\LanguageListController",
- * "access" = "Drupal\language\LanguageAccessController"
+ * "access" = "Drupal\language\LanguageAccessController",
+ * "form" = {
+ * "default" = "Drupal\language\LanguageFormController",
+ * "edit" = "Drupal\language\LanguageFormController"
+ * },
* },
* config_prefix = "language.entity",
* entity_keys = {
diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageListTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageListTest.php
index 1483aa4..0deb280 100644
--- a/core/modules/language/lib/Drupal/language/Tests/LanguageListTest.php
+++ b/core/modules/language/lib/Drupal/language/Tests/LanguageListTest.php
@@ -85,7 +85,7 @@ function testLanguageList() {
// Edit a language.
$name = $this->randomName(16);
$edit = array(
- 'name' => $name,
+ 'label' => $name,
);
$this->drupalPost('admin/config/regional/language/edit/' . $langcode, $edit, t('Save language'));
$this->assertRaw($name, 'The language has been updated.');