diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc index 906a7c1..56b657c 100644 --- a/core/includes/bootstrap.inc +++ b/core/includes/bootstrap.inc @@ -2773,7 +2773,8 @@ function language_list($flags = LANGUAGE_CONFIGURABLE) { $default = language_default(); if (language_multilingual() || module_exists('language')) { // Use language module configuration if available. - $languages = db_query('SELECT * FROM {language} ORDER BY weight ASC, name ASC')->fetchAllAssoc('langcode', PDO::FETCH_ASSOC); + $languages = entity_load_multiple('language'); + uasort($languages, 'Drupal\config\ConfigEntityBase::language'); // Initialize default property so callers have an easy reference and can // save the same object without data loss. diff --git a/core/lib/Drupal/Core/Language/Language.php b/core/lib/Drupal/Core/Language/Language.php index 4db85da..964add7 100644 --- a/core/lib/Drupal/Core/Language/Language.php +++ b/core/lib/Drupal/Core/Language/Language.php @@ -6,6 +6,7 @@ */ namespace Drupal\Core\Language; +use Drupal\Config\ConfigEntityBase; /** * An object containing the information for an interface language. @@ -16,17 +17,66 @@ namespace Drupal\Core\Language; * * @see language_default() */ -class Language { - // Properties within the Language are set up as the default language. - public $name = ''; - public $langcode = ''; +class Language extends ConfigEntityBase { + + /** + * The language UUID. + * + * @var string + */ + public $uuid; + + /** + * Language code, e.g. 'de' or 'en-US'. + * + * @var string + */ + public $langcode; + + /** + * The language name. + * + * @var string + */ + public $name; + + /** + * Direction of language (Left-to-Right = 0, Right-to-Left = 1). + * + * @var int + */ public $direction = LANGUAGE_LTR; - public $weight = 0; - public $default = FALSE; - public $method_id = NULL; + + /** + * A boolean indicating whether the administrator can edit or delete the + * language. + * + * @var bool + */ public $locked = FALSE; /** + * Weight of this language (used for sorting). + * + * @var int + */ + public $weight = 0; + + /** + * A boolean indicating whether the language is the default for the site. + * + * @var bool + */ + protected $default; + + /** + * The language negotiation mechanism. + * + * @var int + */ + public $method_id; + + /** * Language constructor builds the default language object. * * @param array $options @@ -63,4 +113,22 @@ class Language { $this->$var = $value; } } + + /** + * Return TRUE if the current language is the dafult of the site. + * + * @return boolean + */ + public function isDefault() { + return $this->default; + } + + /** + * Set the status for the default value. + * + * @param bool $value + */ + public function setDefault($value) { + $this->default = $value; + } } diff --git a/core/modules/config/config.info b/core/modules/config/config.info index 380f17e..9e73fa1 100644 --- a/core/modules/config/config.info +++ b/core/modules/config/config.info @@ -3,3 +3,7 @@ description = Allows administrators to manage configuration changes. package = Core version = VERSION core = 8.x +; @todo D8: Config module is required for all modules that implement +; ConfigEntityBase. Move the entity system and ConfigEntity* into a +; Drupal\Core component to remove this required dependency. +required = TRUE diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc index af2b3b1..55df5d3 100644 --- a/core/modules/language/language.admin.inc +++ b/core/modules/language/language.admin.inc @@ -169,7 +169,7 @@ function language_admin_overview_form_submit($form, &$form_state) { $old_default = language_default(); foreach ($languages as $langcode => $language) { - $language->default = ($form_state['values']['site_default'] == $langcode); + $language->setDefault($form_state['values']['site_default'] == $langcode)); $language->weight = $form_state['values']['languages'][$langcode]['weight']; language_save($language); } @@ -696,7 +696,7 @@ function language_negotiation_configure_url_form($form, &$form_state) { $t_args = array('%language' => $language->name, '%langcode' => $language->langcode); $form['prefix'][$langcode] = array( '#type' => 'textfield', - '#title' => $language->default ? t('%language (%langcode) path prefix (Default language)', $t_args) : t('%language (%langcode) path prefix', $t_args), + '#title' => $language->isDefault() ? t('%language (%langcode) path prefix (Default language)', $t_args) : t('%language (%langcode) path prefix', $t_args), '#maxlength' => 64, '#default_value' => isset($prefixes[$langcode]) ? $prefixes[$langcode] : '', '#field_prefix' => $base_url . '/', @@ -734,7 +734,7 @@ function language_negotiation_configure_url_form_validate($form, &$form_state) { $value = $form_state['values']['prefix'][$langcode]; if ($value === '') { - if (!$language->default && $form_state['values']['language_negotiation_url_part'] == LANGUAGE_NEGOTIATION_URL_PREFIX) { + if (!$language->isDefault() && $form_state['values']['language_negotiation_url_part'] == LANGUAGE_NEGOTIATION_URL_PREFIX) { // Throw a form error if the prefix is blank for a non-default language, // although it is required for selected negotiation type. form_error($form['prefix'][$langcode], t('The prefix may only be left blank for the default language.')); @@ -758,7 +758,7 @@ function language_negotiation_configure_url_form_validate($form, &$form_state) { $value = $form_state['values']['domain'][$langcode]; if ($value === '') { - if (!$language->default && $form_state['values']['language_negotiation_url_part'] == LANGUAGE_NEGOTIATION_URL_DOMAIN) { + if (!$language->isDefault() && $form_state['values']['language_negotiation_url_part'] == LANGUAGE_NEGOTIATION_URL_DOMAIN) { // Throw a form error if the domain is blank for a non-default language, // although it is required for selected negotiation type. form_error($form['domain'][$langcode], t('The domain may only be left blank for the default language.')); diff --git a/core/modules/language/language.api.php b/core/modules/language/language.api.php index 6f19835..9d413ad 100644 --- a/core/modules/language/language.api.php +++ b/core/modules/language/language.api.php @@ -17,7 +17,7 @@ * A language object. */ function hook_language_presave($language) { - if ($language->default) { + if ($language->isDefault()) { // React to a new default language. example_new_default_language($language); } diff --git a/core/modules/language/language.install b/core/modules/language/language.install index 2884d4b..0b1db76 100644 --- a/core/modules/language/language.install +++ b/core/modules/language/language.install @@ -55,55 +55,6 @@ function language_uninstall() { } /** - * Implements hook_schema(). - */ -function language_schema() { - $schema['language'] = array( - 'description' => 'List of all available languages in the system.', - 'fields' => array( - 'langcode' => array( - 'type' => 'varchar', - 'length' => 12, - 'not null' => TRUE, - 'default' => '', - 'description' => "Language code, e.g. 'de' or 'en-US'.", - ), - 'name' => array( - 'type' => 'varchar', - 'length' => 64, - 'not null' => TRUE, - 'default' => '', - 'description' => 'Language name.', - ), - 'direction' => array( - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - 'description' => 'Direction of language (Left-to-Right = 0, Right-to-Left = 1).', - ), - 'weight' => array( - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - 'description' => 'Weight, used in lists of languages.', - ), - 'locked' => array( - 'type' => 'int', - 'size' => 'tiny', - 'not null' => TRUE, - 'default' => 0, - 'description' => 'A boolean indicating whether the administrator can edit or delete the language.', - ), - ), - 'primary key' => array('langcode'), - 'indexes' => array( - 'list' => array('weight', 'name'), - ), - ); - return $schema; -} - -/** * Implements hook_enable(). */ function language_enable() { @@ -121,3 +72,33 @@ function language_disable() { // will be FALSE, because the language module is disabled. variable_set('language_count', 1); } + +/** + * Migrate languages into configuration. + * + * @ingroup config_upgrade + */ +function language_update_8001() { + $result = db_query('SELECT * FROM {language}'); + foreach ($result as $language) { + // Save the config object. + config('language.site_language.' . $language->langcode) + ->set('langcode', $language->langcode) + ->set('direction', $language->direction) + ->set('locked', $language->locked) + ->set('weight', $language->weight) + ->save(); + } +} + +/** + * Drop the {language} table. + */ +function language_update_8002() { + db_drop_table('language'); +} + +/** + * @} End of "defgroup updates-7.x-to-8.x". + * The next series of updates should start at 9000. + */ diff --git a/core/modules/language/language.module b/core/modules/language/language.module index 5b62382..308ec62 100644 --- a/core/modules/language/language.module +++ b/core/modules/language/language.module @@ -247,7 +247,7 @@ function language_save($language) { watchdog('language', 'The %language (%langcode) language has been updated.', $t_args); } - if (!empty($language->default)) { + if ($language->isDefault()) { // Set the new version of this language as default in a variable. $default_language = language_default(); variable_set('language_default', (array) $language); @@ -336,6 +336,73 @@ function language_css_alter(&$css) { } /** + * Implements MODULE_config_import_create(). + */ +function language_config_import_create($name, $new_config, $old_config) { + if (strpos($name, 'language.site_language.') !== 0) { + return FALSE; + } + + $language = entity_create('language', $new_config->get()); + $language->save(); + return TRUE; +} + +/** + * Implements MODULE_config_import_change(). + */ +function language_config_import_change($name, $new_config, $old_config) { + if (strpos($name, 'language.site_language.') !== 0) { + return FALSE; + } + + list(, , $id) = explode('.', $name); + $language = entity_load('language', $id); + + $language->original = clone $language; + foreach ($old_config->get() as $property => $value) { + $language->original->$property = $value; + } + + foreach ($new_config->get() as $property => $value) { + $language->$property = $value; + } + + $language->save(); + return TRUE; +} + +/** + * Implements MODULE_config_import_delete(). + */ +function language_config_import_delete($name, $new_config, $old_config) { + if (strpos($name, 'language.site_language.') !== 0) { + return FALSE; + } + + list(, , $id) = explode('.', $name); + entity_delete_multiple('language', array($id)); + return TRUE; +} + +/** + * Implements hook_entity_info(). + */ +function language_entity_info() { + $types['language'] = array( + 'label' => 'Language', + 'controller class' => 'Drupal\config\ConfigStorageController', + 'entity class' => 'Drupal\language\Language', + 'config prefix' => 'language.site_language', + 'entity keys' => array( + 'langcode' => 'langcode', + 'uuid' => 'uuid', + ), + ); + return $types; +} + +/** * Implements hook_language_types_info(). * * Defines the three core language types: diff --git a/core/modules/language/language.negotiation.inc b/core/modules/language/language.negotiation.inc index fa6a517..542ce1f 100644 --- a/core/modules/language/language.negotiation.inc +++ b/core/modules/language/language.negotiation.inc @@ -518,7 +518,7 @@ function language_negotiation_url_prefixes_update() { if (empty($prefixes[$language->langcode])) { // For the default language, set the prefix to the empty string, // otherwise use the langcode. - $prefixes[$language->langcode] = !empty($language->default) ? '' : $language->langcode; + $prefixes[$language->langcode] = $language->isDefault() ? '' : $language->langcode; } // Otherwise we keep the configured prefix. } diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/LanguageUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/LanguageUpgradePathTest.php index 7a30cb0..51b4954 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/LanguageUpgradePathTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/LanguageUpgradePathTest.php @@ -42,7 +42,7 @@ class LanguageUpgradePathTest extends UpgradePathTestBase { $this->assertTrue(language_default()->langcode == 'ca', t('Catalan is the default language')); $languages = language_list(LANGUAGE_ALL); foreach ($languages as $language) { - $this->assertTrue($language->default == ($language->langcode == 'ca'), t('@language default property properly set', array('@language' => $language->name))); + $this->assertTrue($language->isDefault() == ($language->langcode == 'ca'), t('@language default property properly set', array('@language' => $language->name))); } // Check that both comments display on the node.