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.');