diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc index e8525e8..3e5cbd9 100644 --- a/core/includes/bootstrap.inc +++ b/core/includes/bootstrap.inc @@ -2412,22 +2412,25 @@ function language_multilingual() { * (optional) Specifies the state of the languages that have to be returned. * It can be: Language::STATE_CONFIGURABLE, Language::STATE_LOCKED, * Language::STATE_ALL. + * @param $localized + * (optional) Flag indicating if the names of the languages that have to be + * returned must be in the current language or in their native names. * * @return array * An associative array of languages, keyed by the language code, ordered by * weight ascending and name ascending. */ function language_list($flags = Language::STATE_CONFIGURABLE, $localized = FALSE) { - if (!$localized) { - $languages = &drupal_static(__FUNCTION__); - } - else { - $languages = array(); - } + $languages = &drupal_static(__FUNCTION__); + $language_list_localized = &drupal_static('language_list_localized'); + // Initialize master language list. - if (empty($languages)) { + if (!isset($languages) || ($localized && !isset($language_list_localized))) { // Initialize local language list cache. $languages = array(); + if ($localized) { + $language_list_localized = array(); + } // Fill in master language list based on current configuration. $default = language_default(); @@ -2439,13 +2442,7 @@ function language_list($flags = Language::STATE_CONFIGURABLE, $localized = FALSE // save the same object without data loss. foreach ($language_entities as $langcode_config_name) { $langcode = substr($langcode_config_name, strlen('language.entity.')); - if ($localized) { - config_context_enter('Drupal\Core\Config\Context\LanguageConfigContext')->setLanguage(new Language(array('id' => $langcode))); - } $info = \Drupal::config($langcode_config_name)->get(); - if ($localized) { - config_context_leave(); - } $languages[$langcode] = new Language(array( 'default' => ($info['id'] == $default->id), 'name' => $info['label'], @@ -2455,14 +2452,33 @@ function language_list($flags = Language::STATE_CONFIGURABLE, $localized = FALSE 'locked' => $info['locked'], 'weight' => $info['weight'], )); + if ($localized) { + config_context_enter('Drupal\Core\Config\Context\LanguageConfigContext') + ->setLanguage(new Language(array('id' => $langcode))); + $info = \Drupal::config($langcode_config_name)->get(); + $language_list_localized[$langcode] = new Language(array( + 'default' => ($info['id'] == $default->id), + 'name' => $info['label'], + 'label' => $info['label'], + 'id' => $info['id'], + 'direction' => $info['direction'], + 'locked' => $info['locked'], + 'weight' => $info['weight'], + )); + config_context_leave(); + } } Language::sort($languages); + if ($localized) { + Language::sort($language_list_localized); + } } else { // No language module, so use the default language only. $languages = array($default->id => $default); // Add the special languages, they will be filtered later if needed. $languages += language_default_locked_languages($default->weight); + $language_list_localized = $languages; } } @@ -2482,8 +2498,8 @@ function language_list($flags = Language::STATE_CONFIGURABLE, $localized = FALSE foreach ($languages as $langcode => $language) { if (($language->locked && !($flags & Language::STATE_LOCKED)) || (!$language->locked && !($flags & Language::STATE_CONFIGURABLE))) { continue; - } - $filtered_languages[$langcode] = $language; + } + $filtered_languages[$langcode] = $localized ? $language_list_localized[$langcode] : $languages[$langcode]; } return $filtered_languages; diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageSwitchingTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageSwitchingTest.php index d69f0a3..1a5caf5 100644 --- a/core/modules/language/lib/Drupal/language/Tests/LanguageSwitchingTest.php +++ b/core/modules/language/lib/Drupal/language/Tests/LanguageSwitchingTest.php @@ -153,6 +153,12 @@ function testLanguageLinkActiveClass() { $this->assertTrue(isset($links[0]), t('A link generated by :function to the current :language page with langcode :langcode is marked active.', array(':function' => $function_name, ':language' => $current_language, ':langcode' => $langcode))); } + /** + * Creates the translation of a language entity. + * + * @param string $langcode The language code. + * @param string $label The native name of the language + */ private function translateLanguage($langcode, $label) { $file_storage = new FileStorage($this->configDirectories[CONFIG_ACTIVE_DIRECTORY]); $file_storage->write('locale.config.' . $langcode . '.language.entity.' . $langcode,