diff --git a/core/includes/form.inc b/core/includes/form.inc index a12fb34..bbd6a36 100644 --- a/core/includes/form.inc +++ b/core/includes/form.inc @@ -2553,6 +2553,38 @@ function form_process_select($element) { } /** + * Processes a language select list form element. + * + * @param $element + * The form element to process. + */ +function form_process_language_select($element) { + // If #only_enabled => TRUE, show only the enabled + // languages in the select. + $only_enabled = isset($element['#only_enabled']) ? $element['#only_enabled'] : FALSE; + // Locale has a list of predefined languages. Use that if this option is true. + $use_predefined_languages = isset($element['#use_predefined_languages']) ? $element['#use_predefined_languages'] : FALSE; + if (!$only_enabled) { + include_once DRUPAL_ROOT . '/includes/standard.inc'; + $standard_languages = standard_language_list(); + $get_first = function($value) { + return $value[0]; + }; + $options = array_map($get_first, $standard_languages); + $element['#empty_value'] = LANGUAGE_NONE; + $element['#empty_option'] = t('Language neutral'); + $element['#options'] = $options; + $element['#theme'] = 'select'; + $element['#theme_wrappers'] = array('form_element'); + } + else { + $element['#theme_wrappers'] = NULL; + $element['#process'] = array('form_process_language_select'); + } + return $element; +} + +/** * Returns HTML for a select form element. * * It is possible to group options together; to do this, change the format of @@ -4462,3 +4494,4 @@ function _batch_queue($batch_set) { /** * @} End of "defgroup batch". */ + diff --git a/core/modules/locale/locale.admin.inc b/core/modules/locale/locale.admin.inc index 97d6b64..8cbb352 100644 --- a/core/modules/locale/locale.admin.inc +++ b/core/modules/locale/locale.admin.inc @@ -192,14 +192,11 @@ function locale_language_overview_form_submit($form, &$form_state) { * User interface for the language addition screen. */ function locale_languages_add_form($form, &$form_state) { - $predefined_languages = _locale_prepare_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', + '#type' => 'language_select', '#title' => t('Language name'), - '#default_value' => $predefined_default, - '#options' => $predefined_languages, + '#use_predefined_languages' => TRUE, + '#only_enabled' => FALSE, ); $form['predefined_submit'] = array( '#type' => 'submit', diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module index 103c284..27bdc7e 100644 --- a/core/modules/locale/locale.module +++ b/core/modules/locale/locale.module @@ -355,10 +355,10 @@ function locale_form_alter(&$form, &$form_state, $form_id) { function locale_form_node_form_alter(&$form, &$form_state) { if (isset($form['#node']->type) && locale_multilingual_node_type($form['#node']->type)) { $form['language'] = array( - '#type' => 'select', + '#type' => 'language_select', '#title' => t('Language'), '#default_value' => (isset($form['#node']->language) ? $form['#node']->language : ''), - '#options' => array(LANGUAGE_NONE => t('Language neutral')) + locale_language_list('name'), + '#only_enabled' => TRUE, ); } // Node type without language selector: assign the default for new nodes @@ -607,9 +607,49 @@ function locale_modules_disabled($modules) { locale_modules_enabled($modules); } +/** + * Implements hook_element_info_alter(). + */ +function locale_element_info_alter(&$type) { + $process = array(); + + foreach ($type['language_select']['#process'] as $pfunction) { + if ($pfunction != 'form_process_language_select') { + $process[] = $pfunction; + } + else { + $process[] = 'form_process_language_select_locale'; + } + } + $type['language_select']['#process'] = $process; +} + // --------------------------------------------------------------------------------- // Locale core functionality +function form_process_language_select_locale($element) { + $only_enabled = isset($element['#only_enabled']) ? $element['#only_enabled'] : FALSE; + // Locale has a list of predefined languages. Use that if this option is true. + $use_predefined_languages = isset($element['#use_predefined_languages']) ? $element['#use_predefined_languages'] : FALSE; + if (!$only_enabled) { + if ($use_predefined_languages) { + $options = _locale_prepare_predefined_list(); + $element['#default_value'] = key($options); + } + $element['#options'] = $options; + $element['#theme'] = 'select'; + $element['#theme_wrappers'] = array('form_element'); + } + else { + $element['#empty_value'] = LANGUAGE_NONE; + $element['#empty_option'] = t('Language neutral'); + $element['#theme'] = 'select'; + $element['#theme_wrappers'] = array('form_element'); + $element['#options'] = locale_language_list('name'); + } + return $element; +} + /** * Provides interface translation services. * diff --git a/core/modules/path/path.admin.inc b/core/modules/path/path.admin.inc index c8a6963..2d708e9 100644 --- a/core/modules/path/path.admin.inc +++ b/core/modules/path/path.admin.inc @@ -143,8 +143,11 @@ function path_admin_form($form, &$form_state, $path = array('source' => '', 'ali } else { $form['language'] = array( - '#type' => 'value', - '#value' => $path['language'] + '#type' => 'language_select', + '#only_enabled' => TRUE, + '#default_value' => $path['language'], + '#description' => t('A path alias set for a specific language will always be used when displaying this page in that language, and takes precedence over path aliases set for All languages.'), + '#weight' => -10, ); } diff --git a/core/modules/system/system.module b/core/modules/system/system.module index f4261e1..2af08cd 100644 --- a/core/modules/system/system.module +++ b/core/modules/system/system.module @@ -458,6 +458,12 @@ function system_element_info() { '#empty' => '', '#theme' => 'tableselect', ); + $types['language_select'] = array( + '#input' => TRUE, + '#multiple' => FALSE, + '#process' => array('form_process_language_select', 'form_process_select', 'ajax_process_form'), + '#title' => t('Language'), + ); // Form structure. $types['item'] = array(