diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc index 247c90efd01..21e9a6d4b58 100644 --- a/includes/bootstrap.inc +++ b/includes/bootstrap.inc @@ -2376,6 +2376,12 @@ function language_list($field = 'language') { if (!isset($languages)) { if (drupal_multilingual() || module_exists('locale')) { $languages['language'] = db_query('SELECT * FROM {languages} ORDER BY weight ASC, name ASC')->fetchAllAssoc('language'); + // Users cannot uninstall the native English language. However, we allow + // it to be hidden from the installed languages. Therefore, at least one + // other language must be enabled then. + if (!$languages['language']['en']->enabled && !variable_get('language_native_enabled', TRUE)) { + unset($languages['language']['en']); + } } else { // No locale module, so use the default language only. diff --git a/modules/field/field.multilingual.inc b/modules/field/field.multilingual.inc index 32eb6a98f79..c8ef28e2525 100644 --- a/modules/field/field.multilingual.inc +++ b/modules/field/field.multilingual.inc @@ -153,8 +153,7 @@ function _field_language_suggestion($available_languages, $language_suggestion, * An array of language codes. */ function field_content_languages() { - $languages = language_list('enabled'); - return array_keys($languages[1] + array(LANGUAGE_NONE => NULL)); + return array_keys(language_list() + array(LANGUAGE_NONE => NULL)); } /** diff --git a/modules/translation/translation.module b/modules/translation/translation.module index 03bf079c9fe..9a6a54924b6 100644 --- a/modules/translation/translation.module +++ b/modules/translation/translation.module @@ -126,6 +126,24 @@ function translation_form_node_type_form_alter(&$form, &$form_state) { function translation_form_node_form_alter(&$form, &$form_state) { if (translation_supported_type($form['#node']->type)) { $node = $form['#node']; + $languages = language_list('enabled'); + $disabled_languages = isset($languages[0]) ? $languages[0] : FALSE; + $translator_widget = $disabled_languages && user_access('translate content'); + $groups = array(t('Disabled'), t('Enabled')); + // Allow translators to enter content in disabled languages. Translators + // might need to distinguish between enabled and disabled languages, hence + // we divide them in two option groups. + if ($translator_widget) { + $options = array(); + $language_list = locale_language_list('name', TRUE); + foreach (array(1, 0) as $status) { + $group = $groups[$status]; + foreach ($languages[$status] as $langcode => $language) { + $options[$group][$langcode] = $language_list[$langcode]; + } + } + $form['language']['#options'] = $options; + } if (!empty($node->translation_source)) { // We are creating a translation. Add values and lock language field. $form['translation_source'] = array('#type' => 'value', '#value' => $node->translation_source); @@ -136,9 +154,15 @@ function translation_form_node_form_alter(&$form, &$form_state) { // node to some language which is already in the translation set. Also remove the // language neutral option. unset($form['language']['#options'][LANGUAGE_NONE]); - foreach (translation_node_get_translations($node->tnid) as $translation) { + foreach (translation_node_get_translations($node->tnid) as $langcode => $translation) { if ($translation->nid != $node->nid) { - unset($form['language']['#options'][$translation->language]); + if ($translator_widget) { + $group = $groups[(int)!isset($disabled_languages[$langcode])]; + unset($form['language']['#options'][$group][$langcode]); + } + else { + unset($form['language']['#options'][$langcode]); + } } } // Add translation values and workflow options. diff --git a/modules/translation/translation.test b/modules/translation/translation.test index 1930b591f7e..c899ca381d4 100644 --- a/modules/translation/translation.test +++ b/modules/translation/translation.test @@ -83,6 +83,23 @@ class TranslationTestCase extends DrupalWebTestCase { $edit['translation[status]'] = FALSE; $this->drupalPost('node/' . $node_translation->nid . '/edit', $edit, t('Save')); $this->assertRaw(t('Basic page %title has been updated.', array('%title' => $node_translation_title)), t('Translated node updated.')); + + $this->drupalLogin($admin_user); + + // Disable Spanish and confirm that links to the Spanish translations do + // not appear on the English node. + $edit = array(); + $edit['enabled[es]'] = FALSE; + $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration')); + $this->drupalGet('node/' . $node->nid); + $languages = language_list(); + $this->assertNoText($languages['es']->native); + + $this->drupalLogin($translator); + + // Confirm that Spanish is still an option for translators when creating nodes. + $this->drupalGet('node/add/page'); + $this->assertRaw('value="' . 'es' .'"', t('Spanish is available in language selection')); } /**