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 {