diff --git a/core/lib/Drupal/Core/Language/LanguageManager.php b/core/lib/Drupal/Core/Language/LanguageManager.php index e86c6ce..f0e41ca 100644 --- a/core/lib/Drupal/Core/Language/LanguageManager.php +++ b/core/lib/Drupal/Core/Language/LanguageManager.php @@ -134,32 +134,13 @@ public function getLanguages($flags = LanguageInterface::STATE_CONFIGURABLE) { // No language module, so use the default language only. $default = $this->getDefaultLanguage(); $this->languages = array($default->id => $default); - // Add the special languages, they will be filtered later if needed. - $this->languages += $this->getDefaultLockedLanguages($default->weight); - } + } // Filter the full list of languages based on the value of the $all flag. By // default we remove the locked languages, but the caller may request for // those languages to be added as well. - $filtered_languages = array(); - // Add the site's default language if flagged as allowed value. - if ($flags & LanguageInterface::STATE_SITE_DEFAULT) { - $default = isset($default) ? $default : $this->getDefaultLanguage(); - // Rename the default language. But we do not want to do this globally, - // if we're acting on a global object, so clone the object first. - $default = clone $default; - $default->name = $this->t("Site's default language (@lang_name)", array('@lang_name' => $default->name)); - $filtered_languages['site_default'] = $default; - } - - foreach ($this->languages as $id => $language) { - if (($language->locked && ($flags & LanguageInterface::STATE_LOCKED)) || (!$language->locked && ($flags & LanguageInterface::STATE_CONFIGURABLE))) { - $filtered_languages[$id] = $language; - } - } - - return $filtered_languages; + return $this->languageFilter($this->languages, $flags); } /** @@ -383,4 +364,41 @@ public function getConfigOverrideLanguage() { return $this->getCurrentLanguage(); } + + /** + * Filters the full list of languages based on the value of the flag. + * + * By default removes the locked languages. + * + * @param array $languages + * Array with languages to be filtered. + * + * @param int $flags + * (optional) Specifies the state of the languages that have to be returned. + * It can be: LanguageInterface::STATE_CONFIGURABLE, + * LanguageInterface::STATE_LOCKED, LanguageInterface::STATE_ALL. + * + * @return array + * An associative array of languages, keyed by the language code. + */ + protected function languageFilter(array $languages, $flags = LanguageInterface::STATE_CONFIGURABLE) { + $filtered_languages = array(); + // Add the site's default language if flagged as allowed value. + if ($flags & LanguageInterface::STATE_SITE_DEFAULT) { + $default = isset($default) ? $default : $this->getDefaultLanguage(); + // Rename the default language. But we do not want to do this globally, + // if we're acting on a global object, so clone the object first. + $default = clone $default; + $default->name = $this->t("Site's default language (@lang_name)", array('@lang_name' => $default->name)); + $filtered_languages['site_default'] = $default; + } + + foreach ($languages as $id => $language) { + if (($language->locked && ($flags & LanguageInterface::STATE_LOCKED)) || (!$language->locked && ($flags & LanguageInterface::STATE_CONFIGURABLE))) { + $filtered_languages[$id] = $language; + } + } + + return $filtered_languages; + } } diff --git a/core/modules/language/src/ConfigurableLanguageManager.php b/core/modules/language/src/ConfigurableLanguageManager.php index 1726236..1b46381 100644 --- a/core/modules/language/src/ConfigurableLanguageManager.php +++ b/core/modules/language/src/ConfigurableLanguageManager.php @@ -278,37 +278,12 @@ public function setNegotiator(LanguageNegotiatorInterface $negotiator) { * {@inheritdoc} */ public function getLanguages($flags = LanguageInterface::STATE_CONFIGURABLE) { - if (!isset($this->languages)) { - // Prepopulate the language list with the default language to keep things - // working even if we have no configuration. - $default = $this->getDefaultLanguage(); - $this->languages = array($default->id => $default); - - // Retrieve the list of languages defined in configuration. - $prefix = 'language.entity.'; - $config_ids = $this->configFactory->listAll($prefix); - - // Instantiate languages from config objects. - $weight = 0; - foreach ($this->configFactory->loadMultiple($config_ids) as $config) { - $data = $config->get(); - $langcode = $data['id']; - // Initialize default property so callers have an easy reference and can - // save the same object without data loss. - $data['default'] = ($langcode == $default->id); - $data['name'] = $data['label']; - $this->languages[$langcode] = new Language($data); - $weight = max(array($weight, $this->languages[$langcode]->weight)); - } - - // Add locked languages, they will be filtered later if needed. - $this->languages += $this->getDefaultLockedLanguages($weight); + $languages = entity_load_multiple('configurable_language'); - // Sort the language list by weight then title. - Language::sort($this->languages); - } + // Sort the language list by weight then title. + Language::sort($languages); - return parent::getLanguages($flags); + return $this->languageFilter($languages, $flags); } /** diff --git a/core/modules/language/src/Element/LanguageConfiguration.php b/core/modules/language/src/Element/LanguageConfiguration.php index 273d733..9679dc3 100644 --- a/core/modules/language/src/Element/LanguageConfiguration.php +++ b/core/modules/language/src/Element/LanguageConfiguration.php @@ -97,10 +97,10 @@ protected static function getDefaultOptions() { 'current_interface' => t('Current interface language'), 'authors_default' => t("Author's preferred language"), ); - + /* @var LanguageInterface[] $languages*/ $languages = static::languageManager()->getLanguages(LanguageInterface::STATE_ALL); foreach ($languages as $langcode => $language) { - $language_options[$langcode] = $language->locked ? t('- @name -', array('@name' => $language->name)) : $language->name; + $language_options[$langcode] = $language->locked ? t('- @name -', array('@name' => $language->getName())) : $language->getName(); } return $language_options; diff --git a/core/modules/language/src/Tests/LanguageSelectorTranslatableTest.php b/core/modules/language/src/Tests/LanguageSelectorTranslatableTest.php new file mode 100644 index 0000000..23d3756 --- /dev/null +++ b/core/modules/language/src/Tests/LanguageSelectorTranslatableTest.php @@ -0,0 +1,80 @@ +administrator = $this->drupalCreateUser($this->getAdministratorPermissions(), 'administrator'); + $this->drupalLogin($this->administrator); + + } + /** + * Returns an array of permissions needed for the translator. + */ + protected function getAdministratorPermissions() { + return array_filter( + array('translate interface', + 'administer content translation', + 'create content translations', + 'update content translations', + 'delete content translations', + 'administer languages' + ) + ); + } + + /** + * Test Content Translation language selectors are correctly translate. + */ + public function testLanguageStringSelector() { + // Add another language. + $edit = array('predefined_langcode' => 'es'); + $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add language')); + + // Translate the string English in Spanish (Inglés). Override config entity. + $name_translation = 'Inglés'; + $override = \Drupal::languageManager()->getLanguageConfigOverride('es', 'language.entity.en')->set('label', $name_translation)->save(); + + // Check label is set correctly. + $this->assertEqual($override->get('label'), $name_translation, 'Language label for English is translated into Spanish.'); + + // Check content translation overview selector. + $path = 'es/admin/config/regional/content-language'; + $this->drupalGet($path); + + // Get en language from selector. + $elements = $this->xpath('//select[@id=:id]//option[@value=:option]', array(':id' => 'edit-settings-node-node-settings-language-langcode', ':option' => 'en')); + + // Check the language text is translated. + $this->assertEqual((string) $elements[0], $name_translation, 'Checking the option string English is translated to Spanish.'); + } +}