From 3a3bce39e4f1b7096c7e850b6dd45e37e14fd748 Mon Sep 17 00:00:00 2001 From: Dries Date: Wed, 4 Jul 2012 09:17:19 -0400 Subject: [PATCH] =?UTF-8?q?-=20Patch=20#1649400=20by=20vasi1186,=20G=C3=A1?= =?UTF-8?q?bor=20Hojtsy:=20make=20locked/special=20languages=20fully=20ext?= =?UTF-8?q?ensible.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/includes/bootstrap.inc | 35 ++++++++++++------- core/includes/update.inc | 2 +- core/modules/field/field.multilingual.inc | 2 +- core/modules/language/language.install | 2 +- .../language/Tests/LanguageListTest.php | 24 +++++++++++++ core/modules/translation/translation.module | 2 +- 6 files changed, 51 insertions(+), 16 deletions(-) diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc index a5d2bc91b51..64872be5942 100644 --- a/core/includes/bootstrap.inc +++ b/core/includes/bootstrap.inc @@ -204,9 +204,19 @@ const LANGUAGE_NOT_APPLICABLE = 'zxx'; const LANGUAGE_MULTIPLE = 'mul'; /** - * The language code used when referring to all languages. + * The language state when referring to configurable languages. */ -const LANGUAGE_ALL = TRUE; +const LANGUAGE_CONFIGURABLE = 1; + +/** + * The language state when referring to locked languages. + */ +const LANGUAGE_LOCKED = 2; + +/** + * The language state used when referring to all languages. + */ +const LANGUAGE_ALL = 3; /** * The type of language used to define the content language. @@ -2676,17 +2686,17 @@ function language_multilingual() { } /** - * Returns a list of configured languages. + * Returns a list of languages set up on the site. * - * @param $all - * (optional) A flag depending on the need for locked languages in the - * returned list. + * @param $flags + * (optional) Specifies the state of the languages that have to be returned. + * It can be: LANGUAGE_CONFIGURABLE, LANGUAGE_LOCKED, LANGUAGE_ALL. * * @return * An associative array of languages, keyed by the language code, ordered by * weight ascending and name ascending. */ -function language_list($all = FALSE) { +function language_list($flags = LANGUAGE_CONFIGURABLE) { $languages = &drupal_static(__FUNCTION__); @@ -2712,7 +2722,7 @@ function language_list($all = FALSE) { // No language module, so use the default language only. $languages = array($default->langcode => $default); // Add the special languages, they will be filtered later if needed. - $languages += language_locked_languages($default->weight); + $languages += language_default_locked_languages($default->weight); } } @@ -2721,7 +2731,7 @@ function language_list($all = FALSE) { // those languages to be added as well. $filtered_languages = array(); foreach ($languages as $langcode => $language) { - if ($language->locked && !$all) { + if (($language->locked && !($flags & LANGUAGE_LOCKED)) || (!$language->locked && !($flags & LANGUAGE_CONFIGURABLE))) { continue; } $filtered_languages[$langcode] = $language; @@ -2731,7 +2741,7 @@ function language_list($all = FALSE) { } /** - * Returns a list with the locked languages. + * Returns a list of the default locked languages. * * @param int $weight * An integer value that is used as the start value for the weights of the @@ -2740,7 +2750,7 @@ function language_list($all = FALSE) { * @return * An array of language objects. */ -function language_locked_languages($weight = 0) { +function language_default_locked_languages($weight = 0) { $locked_language = array( 'default' => FALSE, 'locked' => TRUE, @@ -2810,7 +2820,8 @@ function language_name($langcode) { * The language code. */ function language_is_locked($langcode) { - return array_key_exists($langcode, language_locked_languages()); + $language = language_load($langcode); + return ($language ? $language->locked : FALSE); } /** diff --git a/core/includes/update.inc b/core/includes/update.inc index ab373cd3abc..f5e7a5e3d2f 100644 --- a/core/includes/update.inc +++ b/core/includes/update.inc @@ -236,7 +236,7 @@ function update_prepare_d8_language() { db_add_field('language', 'locked', $locked_spec); $max_language_weight = db_query('SELECT MAX(weight) FROM {language}')->fetchField(); - $languages = language_locked_languages($max_language_weight); + $languages = language_default_locked_languages($max_language_weight); foreach ($languages as $language) { db_insert('language') ->fields(array( diff --git a/core/modules/field/field.multilingual.inc b/core/modules/field/field.multilingual.inc index 30c1e419f2e..17d385e0cd1 100644 --- a/core/modules/field/field.multilingual.inc +++ b/core/modules/field/field.multilingual.inc @@ -313,7 +313,7 @@ function field_language($entity_type, $entity, $field_name = NULL, $langcode = N // that language for display. If not, the default one will be // LANGUAGE_NOT_SPECIFIED. $display_langcode[$instance['field_name']] = LANGUAGE_NOT_SPECIFIED; - foreach (language_locked_languages() as $language_locked) { + foreach (language_list(LANGUAGE_LOCKED) as $language_locked) { if (isset($entity->{$instance['field_name']}[$language_locked->langcode])) { $display_langcode[$instance['field_name']] = $language_locked->langcode; break; diff --git a/core/modules/language/language.install b/core/modules/language/language.install index b07753bc398..37f41d69cdb 100644 --- a/core/modules/language/language.install +++ b/core/modules/language/language.install @@ -15,7 +15,7 @@ function language_install() { // Add the default language at first so that language_list() returns this in // language_special_languages(). $default_language = language_save(language_default()); - $languages = language_locked_languages($default_language->weight); + $languages = language_default_locked_languages($default_language->weight); foreach ($languages as $language) { language_save($language); } diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageListTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageListTest.php index 7346bfc0c90..87d6b3b6198 100644 --- a/core/modules/language/lib/Drupal/language/Tests/LanguageListTest.php +++ b/core/modules/language/lib/Drupal/language/Tests/LanguageListTest.php @@ -8,6 +8,7 @@ namespace Drupal\language\Tests; use Drupal\simpletest\WebTestBase; +use Drupal\Core\Language\Language; /** * Functional tests for the language list configuration forms. @@ -162,4 +163,27 @@ class LanguageListTest extends WebTestBase { $t_args = array('%language' => 'English', '%langcode' => 'en'); $this->assertRaw(t('The %language (%langcode) language has been removed.', $t_args), t('The English language has been removed.')); } + + /** + * Functional tests for the language states (locked or configurable). + */ + function testLanguageStates() { + // Add some languages, and also lock some of them. + language_save(new Language(array('name' => $this->randomName(), 'langcode' => 'l1'))); + language_save(new Language(array('name' => $this->randomName(), 'langcode' => 'l2', 'locked' => TRUE))); + language_save(new Language(array('name' => $this->randomName(), 'langcode' => 'l3'))); + language_save(new Language(array('name' => $this->randomName(), 'langcode' => 'l4', 'locked' => TRUE))); + $expected_locked_languages = array('l4' => 'l4', 'l2' => 'l2', 'und' => 'und', 'zxx' => 'zxx', 'mul' => 'mul'); + $expected_all_languages = array('l4' => 'l4', 'l3' => 'l3', 'l2' => 'l2', 'l1' => 'l1', 'en' => 'en', 'und' => 'und', 'zxx' => 'zxx', 'mul' => 'mul'); + $expected_conf_languages = array('l3' => 'l3', 'l1' => 'l1', 'en' => 'en'); + + $locked_languages = language_list(LANGUAGE_LOCKED); + $this->assertEqual(array_diff_key($expected_locked_languages, $locked_languages), array(), t('Locked languages loaded correctly.')); + + $all_languages = language_list(LANGUAGE_ALL); + $this->assertEqual(array_diff_key($expected_all_languages, $all_languages), array(), t('All languages loaded correctly.')); + + $conf_languages = language_list(); + $this->assertEqual(array_diff_key($expected_conf_languages, $conf_languages), array(), t('Configurable languages loaded correctly.')); + } } diff --git a/core/modules/translation/translation.module b/core/modules/translation/translation.module index 4edf54104b0..347935e707a 100644 --- a/core/modules/translation/translation.module +++ b/core/modules/translation/translation.module @@ -137,7 +137,7 @@ function translation_form_node_type_form_alter(&$form, &$form_state) { */ function translation_node_type_language_translation_enabled_validate($element, &$form_state, $form) { if (language_is_locked($form_state['values']['node_type_language_default']) && $form_state['values']['node_type_language_hidden'] && $form_state['values']['node_type_language_translation_enabled']) { - foreach (language_locked_languages() as $language) { + foreach (language_list(LANGUAGE_LOCKED) as $language) { $locked_languages[] = $language->name; } form_set_error('node_type_language_translation_enabled', t('Translation is not supported if language is always one of: @locked_languages', array('@locked_languages' => implode(", ", $locked_languages))));