diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc index 2664a42..c4fa6b5 100644 --- a/core/includes/bootstrap.inc +++ b/core/includes/bootstrap.inc @@ -207,6 +207,13 @@ const LANGUAGE_NOT_APPLICABLE = 'zxx'; const LANGUAGE_MULTIPLE = 'mul'; /** + * The language code used when referring to all languages. + * + * @todo W3C uses this for 'Allar', need to find a better code. + */ +const LANGUAGE_ALL = 'all'; + +/** * The type of language used to define the content language. */ const LANGUAGE_TYPE_CONTENT = 'language_content'; @@ -2540,6 +2547,84 @@ function language_list($only_enabled = FALSE) { } /** + * Prepare a list of languages for use on the interface. + * + * @param $options + * (optional) An array of options to limit/extend the standard langugae list + * based on where is the list going to be used. + * - 'english': set to FALSE to remove the English language. + * - 'system': set to TRUE to add the special LANGUAGE_SYSTEM language. + * - 'content': set to TRUE to add the LANGUAGE_NOT_SPECIFIED, + * LANGUAGE_NOT_APPLICABLE and LANGUAGE_MULTIPLE special languages. + * + * @return + * An associative array of languages, keyed by the language code, ordered by + * weight ascending and name ascending. + */ +function language_list_prepare($languages, $options = array()) { + $options += array( + 'english' => TRUE, + ); + + // Language list is ordered by weight, get the biggest one. + $keys = array_keys($languages); + $max_weight = $languages[array_pop($keys)]->weight; + + if (empty($options['english'])) { + unset($languages['en']); + } + + $locked_language = array( + 'default' => FALSE, + 'locked' => TRUE, + 'enabled' => TRUE, + ); + + if (!empty($options['system'])) { + $languages[LANGUAGE_SYSTEM] = (object) (array( + 'langcode' => LANGUAGE_SYSTEM, + 'name' => t('System (English)'), + 'weight' => ++$max_weight, + 'description' => t('Built-in language for interface translation.'), + ) + $locked_language); + } + + if (!empty($options['content'])) { + $languages[LANGUAGE_NOT_SPECIFIED] = (object) (array( + 'langcode' => LANGUAGE_NOT_SPECIFIED, + 'name' => t('Not specified'), + 'weight' => ++$max_weight, + 'description' => t('May be assigned to content.'), + ) + $locked_language); + $languages[LANGUAGE_NOT_APPLICABLE] = (object) (array( + 'langcode' => LANGUAGE_NOT_APPLICABLE, + 'name' => t('Not applicable'), + 'weight' => ++$max_weight, + 'description' => t('May be assigned to content.'), + ) + $locked_language); + $languages[LANGUAGE_MULTIPLE] = (object) (array( + 'langcode' => LANGUAGE_MULTIPLE, + 'name' => t('Multiple'), + 'weight' => ++$max_weight, + 'description' => t('May be assigned to content.'), + ) + $locked_language); + } + + if (!empty($options['all'])) { + $languages[LANGUAGE_ALL] = (object) (array( + 'langcode' => LANGUAGE_ALL, + 'name' => t('All languages'), + 'weight' => ++$max_weight, + ) + $locked_language); + } + + // Let other modules alter the list. + drupal_alter('language_list_prepare', $languages, $options); + + return $languages; +} + +/** * Loads a language object from the database. * * @param $langcode @@ -2563,14 +2648,21 @@ function language_load($langcode) { * The printed name of the language. */ function language_name($langcode) { + if (empty($langcode)) { + return t('Unknown'); + } if ($langcode == LANGUAGE_NOT_SPECIFIED) { - return t('None'); + return t('Not specified'); + } + if ($langcode == LANGUAGE_NOT_APPLICABLE) { + return t('Not applicable'); + } + if ($langcode == LANGUAGE_MULTIPLE) { + return t('Multiple'); } - if ($language = language_load($langcode)) { return $language->name; } - return t('Unknown (@langcode)', array('@langcode' => $langcode)); } diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc index 33bc147..abddc6f 100644 --- a/core/modules/language/language.admin.inc +++ b/core/modules/language/language.admin.inc @@ -10,7 +10,7 @@ */ function language_admin_overview_form($form, &$form_state) { drupal_static_reset('language_list'); - $languages = language_list(); + $languages = language_list_prepare(language_list(), array('content' => TRUE, 'system' => TRUE)); $default = language_default(); $form['languages'] = array( @@ -29,8 +29,12 @@ function language_admin_overview_form($form, &$form_state) { foreach ($languages as $langcode => $language) { $form['languages'][$langcode]['#weight'] = $language->weight; + $title = check_plain($language->name); + if (!empty($language->description)) { + $title .= '
' . $language->description . '
'; + } $form['languages'][$langcode]['name'] = array( - '#markup' => check_plain($language->name), + '#markup' => $title, ); $form['languages'][$langcode]['enabled'] = array( '#type' => 'checkbox', @@ -53,25 +57,32 @@ function language_admin_overview_form($form, &$form_state) { '#title' => t('Weight for @title', array('@title' => $language->name)), '#title_display' => 'invisible', '#default_value' => $language->weight, - '#attributes' => array( - 'class' => array('language-order-weight'), - ), ); $form['languages'][$langcode]['operations'] = array( '#theme_wrappers' => array('language_admin_operations'), '#weight' => 100, ); - $form['languages'][$langcode]['operations']['edit'] = array( - '#type' => 'link', - '#title' => t('edit'), - '#href' => 'admin/config/regional/language/edit/' . $langcode, - ); - $form['languages'][$langcode]['operations']['delete'] = array( - '#type' => 'link', - '#title' => t('delete'), - '#href' => 'admin/config/regional/language/delete/' . $langcode, - '#access' => $langcode != $default->langcode, - ); + if (empty($language->locked)) { + $form['languages'][$langcode]['weight']['#attributes'] = array( + 'class' => array('language-order-weight'), + ); + $form['languages'][$langcode]['operations']['edit'] = array( + '#type' => 'link', + '#title' => t('edit'), + '#href' => 'admin/config/regional/language/edit/' . $langcode, + ); + $form['languages'][$langcode]['operations']['delete'] = array( + '#type' => 'link', + '#title' => t('delete'), + '#href' => 'admin/config/regional/language/delete/' . $langcode, + '#access' => $langcode != $default->langcode, + ); + } + else { + $form['languages'][$langcode]['default']['#disabled'] = TRUE; + $form['languages'][$langcode]['enabled']['#disabled'] = TRUE; + $form['languages'][$langcode]['weight']['#type'] = 'value'; + } } $form['actions'] = array('#type' => 'actions'); @@ -122,9 +133,10 @@ function theme_language_admin_overview_form_table($variables) { $rows = array(); foreach (element_children($form, TRUE) as $langcode) { $element = &$form[$langcode]; - $row = array( - 'class' => array('draggable'), - ); + $row = array(); + if (empty($form['#languages'][$langcode]->locked)) { + $row['class'] = array('draggable'); + } foreach (element_children($element, TRUE) as $column) { $cell = &$element[$column]; $row['data'][] = drupal_render($cell); diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module index c49dabe..41cd367 100644 --- a/core/modules/locale/locale.module +++ b/core/modules/locale/locale.module @@ -1018,7 +1018,7 @@ function locale_form_language_admin_overview_form_alter(&$form, &$form_state) { 'translated' => 0, 'ratio' => 0, ); - if ($langcode != 'en' || locale_translate_english()) { + if (empty($language->locked) && ($langcode != 'en' || locale_translate_english())) { $form['languages'][$langcode]['locale_statistics'] = array( '#type' => 'link', '#title' => t('@translated/@total (@ratio%)', array( @@ -1029,9 +1029,14 @@ function locale_form_language_admin_overview_form_alter(&$form, &$form_state) { '#href' => 'admin/config/regional/translate/translate', ); } + elseif ($langcode == LANGUAGE_SYSTEM) { + $form['languages'][$langcode]['locale_statistics'] = array( + '#markup' => t('Built-in'), + ); + } else { $form['languages'][$langcode]['locale_statistics'] = array( - '#markup' => t('not applicable'), + '#markup' => t('Not applicable'), ); } } diff --git a/core/modules/locale/locale.pages.inc b/core/modules/locale/locale.pages.inc index e41bae5..af71111 100644 --- a/core/modules/locale/locale.pages.inc +++ b/core/modules/locale/locale.pages.inc @@ -28,7 +28,7 @@ function _locale_translate_seek() { if (!($query = _locale_translate_seek_query())) { $query = array( 'translation' => 'all', - 'language' => 'all', + 'language' => LANGUAGE_ALL, 'string' => '', ); } @@ -64,7 +64,7 @@ function _locale_translate_seek() { } $limit_language = NULL; - if ($query['language'] != LANGUAGE_SYSTEM && $query['language'] != 'all') { + if ($query['language'] != LANGUAGE_SYSTEM && $query['language'] != LANGUAGE_ALL) { $sql_query->condition('language', $query['language']); $limit_language = $query['language']; } @@ -152,12 +152,10 @@ function locale_translation_filters() { // Get all languages, except English drupal_static_reset('language_list'); - $languages = language_list(TRUE); + $languages = language_list_prepare(language_list(TRUE), array('system' => TRUE, 'english' => locale_translate_english(), 'all' => TRUE)); $language_options = array(); foreach ($languages as $langcode => $language) { - if ($langcode != 'en' || locale_translate_english()) { - $language_options[$langcode] = $language->name; - } + $language_options[$langcode] = $language->name; } $filters['string'] = array( @@ -167,7 +165,7 @@ function locale_translation_filters() { $filters['language'] = array( 'title' => t('Language'), - 'options' => array_merge(array('all' => t('All languages'), LANGUAGE_SYSTEM => t('System (English)')), $language_options), + 'options' => $language_options, ); $filters['translation'] = array( diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc index 4e94b26..c0fd658 100644 --- a/core/modules/node/node.pages.inc +++ b/core/modules/node/node.pages.inc @@ -176,7 +176,7 @@ function node_form($form, &$form_state, $node) { $form['#node'] = $node; if (variable_get('node_type_language_' . $node->type, 0) && module_exists('language')) { - $languages = language_list(TRUE); + $languages = language_list_prepare(language_list(TRUE), array('content' => TRUE)); $language_options = array(); foreach ($languages as $langcode => $language) { $language_options[$langcode] = $language->name; @@ -184,9 +184,8 @@ function node_form($form, &$form_state, $node) { $form['langcode'] = array( '#type' => 'select', '#title' => t('Language'), - '#default_value' => (isset($node->langcode) ? $node->langcode : ''), + '#default_value' => (isset($node->langcode) ? $node->langcode : LANGUAGE_NOT_SPECIFIED), '#options' => $language_options, - '#empty_value' => LANGUAGE_NOT_SPECIFIED, ); } else {