diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc index c26ec86..ea1f580 100644 --- a/core/includes/bootstrap.inc +++ b/core/includes/bootstrap.inc @@ -205,6 +205,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. */ diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc index 33bc147..4e4e306 100644 --- a/core/modules/language/language.admin.inc +++ b/core/modules/language/language.admin.inc @@ -61,17 +61,22 @@ function language_admin_overview_form($form, &$form_state) { '#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]['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['actions'] = array('#type' => 'actions'); diff --git a/core/modules/language/language.install b/core/modules/language/language.install index ecf637d..2e0009d 100644 --- a/core/modules/language/language.install +++ b/core/modules/language/language.install @@ -9,8 +9,53 @@ * Implements hook_install(). */ function language_install() { + $languages = language_special_languages(); // Add the default language to the database too. - language_save(language_default()); + $languages[] = language_default(); + foreach ($languages as $language) { + language_save($language); + } +} + +/* + * @see http://drupal.org/node/1471432 + */ +function language_special_languages() { + $locked_language = array( + 'default' => FALSE, + 'locked' => TRUE, + 'enabled' => TRUE, + ); + $languages = language_list(); + // Language list is ordered by weight, get the biggest one. + $keys = array_keys($languages); + $max_weight = $languages[array_pop($keys)]->weight; + $languages[LANGUAGE_SYSTEM] = (object) (array( + 'langcode' => LANGUAGE_SYSTEM, + 'name' => t('System (English)'), + 'weight' => ++$max_weight, + ) + $locked_language); + $languages[LANGUAGE_NOT_SPECIFIED] = (object) (array( + 'langcode' => LANGUAGE_NOT_SPECIFIED, + 'name' => t('Not specified'), + 'weight' => ++$max_weight, + ) + $locked_language); + $languages[LANGUAGE_NOT_APPLICABLE] = (object) (array( + 'langcode' => LANGUAGE_NOT_APPLICABLE, + 'name' => t('Not applicable'), + 'weight' => ++$max_weight, + ) + $locked_language); + $languages[LANGUAGE_MULTIPLE] = (object) (array( + 'langcode' => LANGUAGE_MULTIPLE, + 'name' => t('Multiple'), + 'weight' => ++$max_weight, + ) + $locked_language); + $languages[LANGUAGE_ALL] = (object) (array( + 'langcode' => LANGUAGE_ALL, + 'name' => t('All languages'), + 'weight' => ++$max_weight, + ) + $locked_language); + return $languages; } /** @@ -65,6 +110,13 @@ function language_schema() { 'default' => 0, 'description' => 'Weight, used in lists of languages.', ), + 'locked' => array( + 'type' => 'int', + 'size' => 'tiny', + 'not null' => TRUE, + 'default' => 0, + 'description' => 'A boolean indicating whether the administrator can edit or delete the language.', + ), ), 'primary key' => array('langcode'), 'indexes' => array( @@ -101,3 +153,23 @@ function language_update_8000() { variable_set('language_default', $language_default); } } + +/** + * Adds the locked column and saves the special languages. + */ +function language_update_8001() { + if (!db_field_exists('language', 'locked')) { + $locked_spec = array( + 'type' => 'int', + 'size' => 'tiny', + 'not null' => TRUE, + 'default' => 0, + 'description' => 'A boolean indicating whether the administrator can edit or delete the language.', + ); + db_add_field('language', 'locked', $locked_spec); + } + $languages = language_special_languages(); + foreach ($languages as $language) { + language_save($language); + } +} diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module index 6d3ded0..3025415 100644 --- a/core/modules/locale/locale.module +++ b/core/modules/locale/locale.module @@ -1019,7 +1019,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( @@ -1030,9 +1030,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 0d59f42..5f7a4ce 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']; } @@ -119,7 +119,7 @@ function _locale_translate_language_list($translation, $limit_language) { } $output = ''; foreach ($languages as $langcode => $language) { - if (!$limit_language || $limit_language == $langcode) { + if (empty($language->locked) && (!$limit_language || $limit_language == $langcode)) { $output .= (!empty($translation[$langcode])) ? $langcode . ' ' : "$langcode "; } } @@ -155,7 +155,7 @@ function locale_translation_filters() { $languages = language_list(TRUE); $language_options = array(); foreach ($languages as $langcode => $language) { - if ($langcode != 'en' || locale_translate_english()) { + if (empty($language->locked) && ($langcode != 'en' || locale_translate_english())) { $language_options[$langcode] = $language->name; } } @@ -167,7 +167,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' => array_merge(array(LANGUAGE_ALL => t('All languages'), LANGUAGE_SYSTEM => t('System (English)')), $language_options), ); $filters['translation'] = array( @@ -343,6 +343,9 @@ function locale_translate_edit_form($form, &$form_state, $lid) { // Approximate the number of rows to use in the default textarea. $rows = min(ceil(str_word_count($source_array[0]) / 12), 10); foreach ($languages as $langcode => $language) { + if (!empty($language->locked)) { + continue; + } $form['translations'][$langcode] = array( '#type' => 'fieldset', '#title' => $language->name, diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc index 4e94b26..df59ed2 100644 --- a/core/modules/node/node.pages.inc +++ b/core/modules/node/node.pages.inc @@ -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 {