Commit 0b55dcd8 authored by catch's avatar catch

Issue #1862202 by plach, Berdir, katbailey, ParisLiakos, alexpott, chx, sun,...

Issue #1862202 by plach, Berdir, katbailey, ParisLiakos, alexpott, chx, sun, larowlan, Gábor Hojtsy, cosmicdreams, vijaycs85, YesCT, penyaskito, andypost, Albert Volkman, joelpitett: Objectify the language system.
parent 37723a56
...@@ -225,7 +225,6 @@ services: ...@@ -225,7 +225,6 @@ services:
arguments: ['@event_dispatcher', '@service_container', '@controller_resolver'] arguments: ['@event_dispatcher', '@service_container', '@controller_resolver']
language_manager: language_manager:
class: Drupal\Core\Language\LanguageManager class: Drupal\Core\Language\LanguageManager
arguments: ['@state', '@module_handler']
string_translator.custom_strings: string_translator.custom_strings:
class: Drupal\Core\StringTranslation\Translator\CustomStrings class: Drupal\Core\StringTranslation\Translator\CustomStrings
arguments: ['@settings'] arguments: ['@settings']
...@@ -233,6 +232,9 @@ services: ...@@ -233,6 +232,9 @@ services:
- { name: string_translator, priority: 30 } - { name: string_translator, priority: 30 }
string_translation: string_translation:
class: Drupal\Core\StringTranslation\TranslationManager class: Drupal\Core\StringTranslation\TranslationManager
arguments: ['@language_manager']
calls:
- [initLanguageManager]
database.slave: database.slave:
class: Drupal\Core\Database\Connection class: Drupal\Core\Database\Connection
factory_class: Drupal\Core\Database\Database factory_class: Drupal\Core\Database\Database
...@@ -518,11 +520,6 @@ services: ...@@ -518,11 +520,6 @@ services:
tags: tags:
- { name: event_subscriber } - { name: event_subscriber }
arguments: ['@config.storage', '@config.storage.snapshot'] arguments: ['@config.storage', '@config.storage.snapshot']
language_request_subscriber:
class: Drupal\Core\EventSubscriber\LanguageRequestSubscriber
tags:
- { name: event_subscriber }
arguments: ['@language_manager', '@string_translation']
exception_controller: exception_controller:
class: Drupal\Core\Controller\ExceptionController class: Drupal\Core\Controller\ExceptionController
arguments: ['@content_negotiation', '@string_translation', '@title_resolver', '@html_page_renderer'] arguments: ['@content_negotiation', '@string_translation', '@title_resolver', '@html_page_renderer']
......
...@@ -2331,7 +2331,7 @@ function drupal_installation_attempted() { ...@@ -2331,7 +2331,7 @@ function drupal_installation_attempted() {
function drupal_language_initialize() { function drupal_language_initialize() {
$language_manager = \Drupal::languageManager(); $language_manager = \Drupal::languageManager();
$language_manager->init(); $language_manager->init();
\Drupal::translation()->setDefaultLangcode($language_manager->getLanguage(Language::TYPE_INTERFACE)->id); \Drupal::translation()->setDefaultLangcode($language_manager->getCurrentLanguage()->id);
} }
/** /**
...@@ -2343,47 +2343,10 @@ function drupal_language_initialize() { ...@@ -2343,47 +2343,10 @@ function drupal_language_initialize() {
* The type of language object needed, e.g. Language::TYPE_INTERFACE. * The type of language object needed, e.g. Language::TYPE_INTERFACE.
* *
* @deprecated as of Drupal 8.0. Use * @deprecated as of Drupal 8.0. Use
* \Drupal::languageManager()->getLanguage($type). * \Drupal::languageManager()->getCurrentLanguage().
*/ */
function language($type) { function language($type) {
return \Drupal::languageManager()->getLanguage($type); return \Drupal::languageManager()->getCurrentLanguage($type);
}
/**
* Returns an array of the available language types.
*
* @return array
* An array of all language types where the keys of each are the language type
* name and its value is its configurability (TRUE/FALSE).
*/
function language_types_get_all() {
$types = \Drupal::config('system.language.types')->get('all');
return $types ? $types : array_keys(language_types_get_default());
}
/**
* Returns a list of the built-in language types.
*
* @return array
* An array of key-values pairs where the key is the language type name and
* the value is its configurability (TRUE/FALSE).
*/
function language_types_get_default() {
return array(
Language::TYPE_INTERFACE => TRUE,
Language::TYPE_CONTENT => FALSE,
Language::TYPE_URL => FALSE,
);
}
/**
* Returns TRUE if there is more than one language enabled.
*
* @return bool
* TRUE if more than one language is enabled.
*/
function language_multilingual() {
return \Drupal::languageManager()->isMultilingual();
} }
/** /**
...@@ -2397,101 +2360,12 @@ function language_multilingual() { ...@@ -2397,101 +2360,12 @@ function language_multilingual() {
* @return array * @return array
* An associative array of languages, keyed by the language code, ordered by * An associative array of languages, keyed by the language code, ordered by
* weight ascending and name ascending. * weight ascending and name ascending.
*/
function language_list($flags = Language::STATE_CONFIGURABLE) {
$languages = &drupal_static(__FUNCTION__);
// Initialize master language list.
if (!isset($languages)) {
// Initialize local language list cache.
$languages = array();
// Fill in master language list based on current configuration.
$default = language_default();
if (language_multilingual() || \Drupal::moduleHandler()->moduleExists('language')) {
// Use language module configuration if available.
$language_entities = config_get_storage_names_with_prefix('language.entity.');
// Initialize default property so callers have an easy reference and can
// save the same object without data loss.
foreach ($language_entities as $langcode_config_name) {
$langcode = substr($langcode_config_name, strlen('language.entity.'));
$info = \Drupal::config($langcode_config_name)->get();
$languages[$langcode] = new Language(array(
'default' => ($info['id'] == $default->id),
'name' => $info['label'],
'id' => $info['id'],
'direction' => $info['direction'],
'locked' => $info['locked'],
'weight' => $info['weight'],
));
}
Language::sort($languages);
}
// If the language module is enabled but the configuration has not been
// written yet, returning an empty language list will cause errors. For
// example the cache clear in search_module_preinstall().
if (empty($languages)) {
// 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);
}
}
// 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 & Language::STATE_SITE_DEFAULT) {
$default = isset($default) ? $default : language_default();
// Rename the default language.
$default->name = t("Site's default language (@lang_name)", array('@lang_name' => $default->name));
$filtered_languages['site_default'] = $default;
}
foreach ($languages as $langcode => $language) {
if (($language->locked && !($flags & Language::STATE_LOCKED)) || (!$language->locked && !($flags & Language::STATE_CONFIGURABLE))) {
continue;
}
$filtered_languages[$langcode] = $language;
}
return $filtered_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
* locked languages.
* *
* @return array * @deprecated as of Drupal 8.0. Use
* An array of language objects. * \Drupal::languageManager()->getLanguages() instead.
*/ */
function language_default_locked_languages($weight = 0) { function language_list($flags = Language::STATE_CONFIGURABLE) {
$locked_language = array( return \Drupal::languageManager()->getLanguages($flags);
'default' => FALSE,
'locked' => TRUE,
'enabled' => TRUE,
);
$languages = array();
$languages[Language::LANGCODE_NOT_SPECIFIED] = new Language(array(
'id' => Language::LANGCODE_NOT_SPECIFIED,
'name' => t('Not specified'),
'weight' => ++$weight,
) + $locked_language);
$languages[Language::LANGCODE_NOT_APPLICABLE] = new Language(array(
'id' => Language::LANGCODE_NOT_APPLICABLE,
'name' => t('Not applicable'),
'weight' => ++$weight,
) + $locked_language);
return $languages;
} }
/** /**
...@@ -2502,47 +2376,14 @@ function language_default_locked_languages($weight = 0) { ...@@ -2502,47 +2376,14 @@ function language_default_locked_languages($weight = 0) {
* *
* @return \Drupal\core\Language\Language|null * @return \Drupal\core\Language\Language|null
* A fully-populated language object or NULL. * A fully-populated language object or NULL.
*/
function language_load($langcode) {
$languages = language_list(Language::STATE_ALL);
return isset($languages[$langcode]) ? $languages[$langcode] : NULL;
}
/**
* Produced the printed name for a language for display.
* *
* @param string $langcode * @see \Drupal\Core\Language\LanguageManager::getLanguage()
* The language code.
* *
* @return string * @deprecated as of Drupal 8.0. Use \Drupal::languageManager()->getLanguage()
* The printed name of the language. * instead.
*/ */
function language_name($langcode) { function language_load($langcode) {
if ($langcode == Language::LANGCODE_NOT_SPECIFIED) { return \Drupal::languageManager()->getLanguage($langcode);
return t('None');
}
if ($language = language_load($langcode)) {
return $language->name;
}
if (empty($langcode)) {
return t('Unknown');
}
return t('Unknown (@langcode)', array('@langcode' => $langcode));
}
/**
* Checks if a language is locked.
*
* @param string $langcode
* The language code.
*
* @return bool
* Returns whether the language is locked.
*/
function language_is_locked($langcode) {
$language = language_load($langcode);
return ($language ? $language->locked : FALSE);
} }
/** /**
...@@ -2550,35 +2391,12 @@ function language_is_locked($langcode) { ...@@ -2550,35 +2391,12 @@ function language_is_locked($langcode) {
* *
* @return \Drupal\Core\Language\Language * @return \Drupal\Core\Language\Language
* A language object. * A language object.
*/
function language_default() {
$info = variable_get('language_default', array(
'id' => 'en',
'name' => 'English',
'direction' => 0,
'weight' => 0,
'locked' => 0,
));
$info['default'] = TRUE;
return new Language($info);
}
/**
* Stores or retrieves the path derived during language negotiation.
* *
* @param string $new_path * @deprecated as of Drupal 8.0. Use
* The altered path. * \Drupal::languageManager()->getDefaultLanguage() instead.
*
* @todo Replace this with a path processor in language module. See
* http://drupal.org/node/1888424.
*/ */
function _language_resolved_path($new_path = NULL) { function language_default() {
$path = &drupal_static(__FUNCTION__, NULL); return \Drupal::languageManager()->getDefaultLanguage();
if ($new_path === NULL) {
return $path;
}
$path = $new_path;
return $path;
} }
/** /**
......
...@@ -4531,11 +4531,12 @@ function drupal_render_cid_parts($granularity = NULL) { ...@@ -4531,11 +4531,12 @@ function drupal_render_cid_parts($granularity = NULL) {
global $theme, $base_root, $user; global $theme, $base_root, $user;
$cid_parts[] = $theme; $cid_parts[] = $theme;
// If Locale is enabled but we have only one language we do not need it as cid
// part. // If we have only one language enabled we do not need it as cid part.
if (language_multilingual()) { $language_manager = \Drupal::languageManager();
foreach (language_types_get_configurable() as $language_type) { if ($language_manager->isMultilingual()) {
$cid_parts[] = language($language_type)->id; foreach ($language_manager->getLanguageTypes() as $type) {
$cid_parts[] = $language_manager->getCurrentLanguage($type)->id;
} }
} }
......
<?php <?php
use Drupal\Component\Utility\UserAgent;
use Drupal\Component\Utility\Crypt; use Drupal\Component\Utility\Crypt;
use Drupal\Component\Utility\Settings; use Drupal\Component\Utility\Settings;
...@@ -300,6 +301,9 @@ function install_begin_request(&$install_state) { ...@@ -300,6 +301,9 @@ function install_begin_request(&$install_state) {
exit; exit;
} }
// Register the 'language_manager' service.
$container->register('language_manager', 'Drupal\Core\Language\LanguageManager');
// If we have a language selected and it is not yet saved in the system // If we have a language selected and it is not yet saved in the system
// (eg. pre-database data screens we are unable to persistently store // (eg. pre-database data screens we are unable to persistently store
// the default language), we should set language_default so the proper // the default language), we should set language_default so the proper
...@@ -370,7 +374,6 @@ function install_begin_request(&$install_state) { ...@@ -370,7 +374,6 @@ function install_begin_request(&$install_state) {
else { else {
// @todo Move into a proper Drupal\Core\DependencyInjection\InstallContainerBuilder. // @todo Move into a proper Drupal\Core\DependencyInjection\InstallContainerBuilder.
$container = new ContainerBuilder(); $container = new ContainerBuilder();
$container->register('event_dispatcher', 'Symfony\Component\EventDispatcher\EventDispatcher'); $container->register('event_dispatcher', 'Symfony\Component\EventDispatcher\EventDispatcher');
$container->register('config.storage', 'Drupal\Core\Config\InstallStorage'); $container->register('config.storage', 'Drupal\Core\Config\InstallStorage');
...@@ -388,9 +391,7 @@ function install_begin_request(&$install_state) { ...@@ -388,9 +391,7 @@ function install_begin_request(&$install_state) {
->addArgument(new Reference('config.typed')); ->addArgument(new Reference('config.typed'));
// Register the 'language_manager' service. // Register the 'language_manager' service.
$container $container->register('language_manager', 'Drupal\Core\Language\LanguageManager');
->register('language_manager', 'Drupal\Core\Language\LanguageManager')
->addArgument(NULL);
// Register the translation services. // Register the translation services.
install_register_translation_service($container); install_register_translation_service($container);
...@@ -1505,6 +1506,7 @@ function install_register_translation_service(ContainerBuilder $container) { ...@@ -1505,6 +1506,7 @@ function install_register_translation_service(ContainerBuilder $container) {
$container->register('string_translator.custom_strings', 'Drupal\Core\StringTranslation\Translator\CustomStrings') $container->register('string_translator.custom_strings', 'Drupal\Core\StringTranslation\Translator\CustomStrings')
->addArgument(settings()); ->addArgument(settings());
$container->register('string_translation', 'Drupal\Core\StringTranslation\TranslationManager') $container->register('string_translation', 'Drupal\Core\StringTranslation\TranslationManager')
->addArgument(new Reference('language_manager'))
->addMethodCall('addTranslator', array(new Reference('string_translator.file_translation'))) ->addMethodCall('addTranslator', array(new Reference('string_translator.file_translation')))
->addMethodCall('addTranslator', array(new Reference('string_translator.custom_strings'))); ->addMethodCall('addTranslator', array(new Reference('string_translator.custom_strings')));
} }
...@@ -1582,9 +1584,6 @@ function install_select_language(&$install_state) { ...@@ -1582,9 +1584,6 @@ function install_select_language(&$install_state) {
* @ingroup forms * @ingroup forms
*/ */
function install_select_language_form($form, &$form_state, $files = array()) { function install_select_language_form($form, &$form_state, $files = array()) {
include_once __DIR__ . '/../modules/language/language.module';
include_once __DIR__ . '/../modules/language/language.negotiation.inc';
$standard_languages = LanguageManager::getStandardLanguageList(); $standard_languages = LanguageManager::getStandardLanguageList();
$select_options = array(); $select_options = array();
$browser_options = array(); $browser_options = array();
...@@ -1596,22 +1595,19 @@ function install_select_language_form($form, &$form_state, $files = array()) { ...@@ -1596,22 +1595,19 @@ function install_select_language_form($form, &$form_state, $files = array()) {
// Select lists based on available language files. // Select lists based on available language files.
foreach ($files as $langcode => $uri) { foreach ($files as $langcode => $uri) {
$select_options[$langcode] = isset($standard_languages[$langcode]) ? $standard_languages[$langcode][1] : $langcode; $select_options[$langcode] = isset($standard_languages[$langcode]) ? $standard_languages[$langcode][1] : $langcode;
$browser_options[$langcode] = new Language(array( $browser_options[] = $langcode;
'id' => $langcode,
));
} }
} }
else { else {
// Select lists based on all standard languages. // Select lists based on all standard languages.
foreach ($standard_languages as $langcode => $language_names) { foreach ($standard_languages as $langcode => $language_names) {
$select_options[$langcode] = $language_names[1]; $select_options[$langcode] = $language_names[1];
$browser_options[$langcode] = new Language(array( $browser_options[] = $langcode;
'id' => $langcode,
));
} }
} }
$browser_langcode = language_from_browser($browser_options); $request = Request::createFromGlobals();
$browser_langcode = UserAgent::getBestMatchingLangcode($request->server->get('HTTP_ACCEPT_LANGUAGE'), $browser_options);
$form['langcode'] = array( $form['langcode'] = array(
'#type' => 'select', '#type' => 'select',
'#title' => t('Choose language'), '#title' => t('Choose language'),
......
This diff is collapsed.
...@@ -1235,7 +1235,7 @@ function theme_links($variables) { ...@@ -1235,7 +1235,7 @@ function theme_links($variables) {
$output .= '<ul' . new Attribute($attributes) . '>'; $output .= '<ul' . new Attribute($attributes) . '>';
$active = \Drupal::linkGenerator()->getActive(); $active = \Drupal::linkGenerator()->getActive();
$language_url = \Drupal::languageManager()->getLanguage(Language::TYPE_URL); $language_url = \Drupal::languageManager()->getCurrentLanguage(Language::TYPE_URL);
foreach ($links as $key => $link) { foreach ($links as $key => $link) {
$link += array( $link += array(
...@@ -2072,7 +2072,7 @@ function template_preprocess_html(&$variables) { ...@@ -2072,7 +2072,7 @@ function template_preprocess_html(&$variables) {
$variables['html_attributes'] = new Attribute; $variables['html_attributes'] = new Attribute;
// HTML element attributes. // HTML element attributes.
$language_interface = \Drupal::service('language_manager')->getLanguage(); $language_interface = \Drupal::service('language_manager')->getCurrentLanguage();
$variables['html_attributes']['lang'] = $language_interface->id; $variables['html_attributes']['lang'] = $language_interface->id;
$variables['html_attributes']['dir'] = $language_interface->direction ? 'rtl' : 'ltr'; $variables['html_attributes']['dir'] = $language_interface->direction ? 'rtl' : 'ltr';
......
...@@ -478,9 +478,7 @@ function update_prepare_stored_includes() { ...@@ -478,9 +478,7 @@ function update_prepare_stored_includes() {
foreach ($language_types as $language_type) { foreach ($language_types as $language_type) {
$negotiation = update_variable_get("language_negotiation_$language_type", array()); $negotiation = update_variable_get("language_negotiation_$language_type", array());
foreach ($negotiation as &$method) { foreach ($negotiation as &$method) {
if (isset($method['file']) && $method['file'] == 'includes/locale.inc') { unset($method['file']);
$method['file'] = 'core/modules/language/language.negotiation.inc';
}
} }
update_variable_set("language_negotiation_$language_type", $negotiation); update_variable_set("language_negotiation_$language_type", $negotiation);
} }
...@@ -525,9 +523,6 @@ function update_prepare_d8_language() { ...@@ -525,9 +523,6 @@ function update_prepare_d8_language() {
db_drop_field('languages', 'native'); db_drop_field('languages', 'native');
db_drop_field('languages', 'enabled'); db_drop_field('languages', 'enabled');
// Update language count.
\Drupal::state()->set('language_count', db_query('SELECT COUNT(language) FROM {languages}')->fetchField());
// Rename the languages table to language. // Rename the languages table to language.
db_rename_table('languages', 'language'); db_rename_table('languages', 'language');
...@@ -556,7 +551,7 @@ function update_prepare_d8_language() { ...@@ -556,7 +551,7 @@ function update_prepare_d8_language() {
db_add_field('language', 'locked', $locked_spec); db_add_field('language', 'locked', $locked_spec);
$max_language_weight = db_query('SELECT MAX(weight) FROM {language}')->fetchField(); $max_language_weight = db_query('SELECT MAX(weight) FROM {language}')->fetchField();
$languages = language_default_locked_languages($max_language_weight); $languages = \Drupal::languageManager()->getDefaultLockedLanguages($max_language_weight);
foreach ($languages as $language) { foreach ($languages as $language) {
db_insert('language') db_insert('language')
->fields(array( ->fields(array(
...@@ -1640,7 +1635,7 @@ function update_language_list($flags = Language::STATE_CONFIGURABLE) { ...@@ -1640,7 +1635,7 @@ function update_language_list($flags = Language::STATE_CONFIGURABLE) {
// Fill in master language list based on current configuration. // Fill in master language list based on current configuration.
$default = language_default(); $default = language_default();
if (language_multilingual() || \Drupal::moduleHandler()->moduleExists('language')) { if (\Drupal::languageManager()->isMultilingual() || \Drupal::moduleHandler()->moduleExists('language')) {
// Use language module configuration if available. We can not use // Use language module configuration if available. We can not use
// entity_load_multiple() because this breaks during updates. // entity_load_multiple() because this breaks during updates.
$language_entities = config_get_storage_names_with_prefix('language.entity.'); $language_entities = config_get_storage_names_with_prefix('language.entity.');
...@@ -1665,7 +1660,7 @@ function update_language_list($flags = Language::STATE_CONFIGURABLE) { ...@@ -1665,7 +1660,7 @@ function update_language_list($flags = Language::STATE_CONFIGURABLE) {
// No language module, so use the default language only. // No language module, so use the default language only.
$languages = array($default->id => $default); $languages = array($default->id => $default);
// Add the special languages, they will be filtered later if needed. // Add the special languages, they will be filtered later if needed.
$languages += language_default_locked_languages($default->weight); $languages += \Drupal::languageManager()->getDefaultLockedLanguages($default->weight);
} }
} }
......
...@@ -533,7 +533,7 @@ public static function translation() { ...@@ -533,7 +533,7 @@ public static function translation() {
/** /**
* Returns the language manager service. * Returns the language manager service.
* *
* @return \Drupal\Core\Language\LanguageManager