diff --git a/core/modules/field/modules/text/lib/Drupal/text/Tests/TextTranslationTest.php b/core/modules/field/modules/text/lib/Drupal/text/Tests/TextTranslationTest.php
index c3c696a..8596785 100644
--- a/core/modules/field/modules/text/lib/Drupal/text/Tests/TextTranslationTest.php
+++ b/core/modules/field/modules/text/lib/Drupal/text/Tests/TextTranslationTest.php
@@ -51,7 +51,7 @@ class TextTranslationTest extends WebTestBase {
$this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
// Set "Article" content type to use multilingual support with translation.
- $edit = array('node_type_language_hidden' => FALSE, 'node_type_language_translation_enabled' => TRUE);
+ $edit = array('language_configuration[language_hidden]' => FALSE, 'node_type_language_translation_enabled' => TRUE);
$this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
$this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Article')), t('Article content type has been updated.'));
}
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index a94876e..7df41ef 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -183,7 +183,6 @@ function language_element_info_alter(&$type) {
*
* @param array $element
* The form element to process.
- *
* @return array $element
* The processed form element.
*/
@@ -200,6 +199,204 @@ function language_process_language_select($element) {
}
/**
+ * Implements hook_element_info().
+ */
+function language_element_info() {
+ $types['language_configuration'] = array(
+ '#input' => TRUE,
+ '#tree' => TRUE,
+ '#process' => array('language_configuration_element_process'),
+ );
+ return $types;
+}
+
+/**
+ * Returns the default options for the language configuration form element.
+ *
+ * @return array
+ * An array containing the default options.
+ */
+function language_configuration_element_default_options() {
+ $language_options = array();
+
+ $languages = language_list(LANGUAGE_ALL);
+ foreach ($languages as $langcode => $language) {
+ $language_options[$langcode] = $language->locked ? t('- @name -', array('@name' => $language->name)) : $language->name;
+ }
+
+ $language_options += array(
+ 'site_default' => t("Site's default language (!language)", array('!language' => language_default()->name)),
+ 'current_interface' => t('Current interface language'),
+ 'authors_default' => t("Author's preferred language"),
+ );
+ return $language_options;
+}
+
+/**
+ * Process handler for the language_configuration form element.
+ */
+function language_configuration_element_process($element, &$form_state, &$form) {
+ if (!isset($element['#options'])) {
+ $element['#options'] = array();
+ }
+ $element['language'] = array(
+ '#type' => 'select',
+ '#title' => t('Default language'),
+ '#options' => $element['#options'] + language_configuration_element_default_options(),
+ '#description' => t('Explanation of the language options is found on the languages list page.', array('@languages_list_page' => url('admin/config/regional/language'))),
+ '#default_value' => isset($element['#default_value']['language']) ? $element['#default_value']['language'] : NULL,
+ );
+ $element['language_hidden'] = array(
+ '#type' => 'checkbox',
+ '#title' => t('Hide language selection'),
+ '#default_value' => isset($element['#default_value']['language_hidden']) ? $element['#default_value']['language_hidden'] : NULL,
+ '#description' => t('Language selector appears on create and edit pages.'),
+ );
+ // This is done to avoid a form validation error that checks that, if the
+ // element has an #options key, then the value submitted must be found in the
+ // #options array.
+ unset($element['#options']);
+
+ // Add the entity type and bundle information to the form if they are set.
+ // They will be used, in the submit handler, to generate the names of the
+ // variables that will store the settings.
+ // @todo: #cofig is maybe not a very good key name...
+ if (!isset($form['#language_configuration_elements'])) {
+ $form['#language_configuration_elements'] = array();
+ }
+ $form['#language_configuration_elements'] += array(
+ $element['#name'] => array(
+ 'entity_type' => $element['#config']['entity_type'],
+ 'bundle' => $element['#config']['bundle'],
+ ),
+ );
+
+ return $element;
+}
+
+/**
+ * Submit handler for the forms that have a language_configuration element.
+ */
+function language_configuration_element_submit(&$form, &$form_state) {
+ // Iterate through all the language_configuration elements and save their
+ // values.
+ if (isset($form['#language_configuration_elements'])) {
+ foreach ($form['#language_configuration_elements'] as $element_name => $values) {
+ language_save_default_configuration($values['entity_type'], $values['bundle'], $form_state['values'][$element_name]);
+ }
+ }
+}
+
+/**
+ * Saves a language configuration that is attached to a bundle or entity type.
+ *
+ * @param string $entity_type
+ * A string representing the entity type.
+ * @param string $bundle
+ * A string representing the bundle.
+ * @param array $values
+ * An array with values to be saved. It has the following keys:
+ * - language: the language code.
+ * - language_hidden: if the language element should be hidden or not.
+ */
+function language_save_default_configuration($entity_type, $bundle, $values = array()) {
+ config('language.settings')->set(language_get_default_configuration_settings_path($entity_type, $bundle), array('language' => $values['language'], 'language_hidden' => $values['language_hidden']))->save();
+}
+
+/**
+ * Returns the language configuration stored for an entity type (and bundle).
+ *
+ * @param string $entity_type
+ * A string representing the entity type.
+ * @param string $bundle
+ * A string representing the bundle.
+ * @return array
+ * An array with the following keys:
+ * - language: the language code.
+ * - language_hidden: if the language element is hidden or not.
+ */
+function language_get_default_configuration($entity_type, $bundle) {
+ $configuration = config('language.settings')->get(language_get_default_configuration_settings_path($entity_type, $bundle));
+ if (is_null($configuration)) {
+ $configuration = array();
+ }
+ $configuration += array('language' => 'site_default', 'language_hidden' => TRUE);
+ return $configuration;
+}
+
+/**
+ * Returns the root name of the variables used to store the configuration.
+ *
+ * Based on the entity type (and if needed, bundle), the variables used to store
+ * the configuration will have a common root name.
+ *
+ * @param string $entity_type
+ * A string representing the entity type.
+ * @param string $bundle
+ * A string representing the bundle.
+ * @return string
+ * The root name of the variables.
+ */
+function language_get_default_configuration_settings_path($entity_type, $bundle) {
+ return 'language_default_configuration.' . $entity_type . '.' . $bundle;
+}
+
+/**
+ * Returns the default language code assigned to an entity type and a bundle.
+ *
+ * @param string $entity_type
+ * The entity type.
+ * @param string $bundle
+ * The bundle name.
+ * @return string
+ * The language code.
+ *
+ */
+function language_get_default_langcode($entity_type, $bundle) {
+ $configuration = language_get_default_configuration($entity_type, $bundle);
+
+ if (!isset($configuration['language'])) {
+ $configuration['language'] = 'site_default';
+ }
+
+ $default_value = NULL;
+ $language_interface = language(LANGUAGE_TYPE_INTERFACE);
+ switch ($configuration['language']) {
+ case 'site_default':
+ $default_value = language_default()->langcode;
+ break;
+
+ case 'current_interface':
+ $default_value = $language_interface->langcode;
+ break;
+
+ case 'authors_default':
+ global $user;
+ if (!empty($user->preferred_langcode)) {
+ $default_value = $user->preferred_langcode;
+ }
+ else {
+ $default_value = $language_interface->langcode;
+ }
+ break;
+ }
+ if ($default_value) {
+ return $default_value;
+ }
+ // If we did not found a default value so far, invoke all other modules that
+ // may provide a special default language.
+ $default_value = module_invoke_all('language_default_langcode', $entity_type, $bundle);
+ $default_value = array_shift($default_value);
+ if ($default_value) {
+ return $default_value;
+ }
+
+ // If we still not have a default value, just return the value stored in the
+ // configuration, it has to be an actual language code.
+ return $configuration['language'];
+}
+
+/**
* API function to add or update a language.
*
* @param $language
diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationElementTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationElementTest.php
new file mode 100644
index 0000000..6ad3786
--- /dev/null
+++ b/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationElementTest.php
@@ -0,0 +1,55 @@
+ 'Language configuration form element tests',
+ 'description' => 'Tests the features of the language configuration element field.',
+ 'group' => 'Language',
+ );
+ }
+
+ public function testLanguageConfigurationElement() {
+ $this->drupalGet('language-tests/language_configuration_element');
+ $edit['lang_configuration[language]'] = 'current_interface';
+ $edit['lang_configuration[language_hidden]'] = TRUE;
+ $this->drupalPost(NULL, $edit, 'Save');
+ $lang_conf = language_get_default_configuration('some_custom_type', 'some_bundle');
+ // Check that the settings have been saved.
+ $this->assertEqual($lang_conf['language'], 'current_interface');
+ $this->assertTrue($lang_conf['language_hidden']);
+
+ // Reload the page and save again.
+ $this->drupalGet('language-tests/language_configuration_element');
+ $edit['lang_configuration[language]'] = 'authors_default';
+ $edit['lang_configuration[language_hidden]'] = FALSE;
+ $this->drupalPost(NULL, $edit, 'Save');
+ $lang_conf = language_get_default_configuration('some_custom_type', 'some_bundle');
+ // Check that the settings have been saved.
+ $this->assertEqual($lang_conf['language'], 'authors_default');
+ $this->assertFalse($lang_conf['language_hidden']);
+
+
+ // @todo: check also the interface and write more tests.
+ }
+}
diff --git a/core/modules/language/tests/language_elements_test/language_elements_test.info b/core/modules/language/tests/language_elements_test/language_elements_test.info
new file mode 100644
index 0000000..c88befb
--- /dev/null
+++ b/core/modules/language/tests/language_elements_test/language_elements_test.info
@@ -0,0 +1,6 @@
+name = "Language form elements test"
+description = "Support module for the language form elements tests."
+core = 8.x
+package = Testing
+version = VERSION
+hidden = TRUE
diff --git a/core/modules/language/tests/language_elements_test/language_elements_test.module b/core/modules/language/tests/language_elements_test/language_elements_test.module
new file mode 100644
index 0000000..5e43165
--- /dev/null
+++ b/core/modules/language/tests/language_elements_test/language_elements_test.module
@@ -0,0 +1,40 @@
+ 'Language configuration form element',
+ 'type' => MENU_CALLBACK,
+ 'access callback' => TRUE,
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('language_elements_test_configuration_element'),
+ );
+ return $items;
+}
+
+function language_elements_test_configuration_element() {
+ $conf = language_get_default_configuration('some_custom_type', 'some_bundle');
+
+ $form['lang_configuration'] = array(
+ '#type' => 'language_configuration',
+ '#config' => array(
+ 'entity_type' => 'some_custom_type',
+ 'bundle' => 'some_bundle',
+ ),
+ '#default_value' => $conf,
+ );
+
+ $form['submit'] = array(
+ '#type' => 'submit',
+ '#value' => 'Save',
+ );
+ $form['#submit'][] = 'language_configuration_element_submit';
+ return $form;
+}
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleCommentLanguageTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleCommentLanguageTest.php
index 6776e31..06935f7 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleCommentLanguageTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleCommentLanguageTest.php
@@ -47,7 +47,7 @@ class LocaleCommentLanguageTest extends WebTestBase {
$this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
// Set "Article" content type to use multilingual support.
- $edit = array('node_type_language_hidden' => FALSE);
+ $edit = array('language_configuration[language_hidden]' => FALSE);
$this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
// Enable content language negotiation UI.
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php
index a41d68b..d30526a 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php
@@ -88,7 +88,7 @@ class LocaleContentTest extends WebTestBase {
$this->drupalGet('admin/structure/types/manage/page');
$this->assertText(t('Language settings'), t('Multilingual support fieldset present on content type configuration form.'));
$edit = array(
- 'node_type_language_hidden' => FALSE,
+ 'language_configuration[language_hidden]' => FALSE,
);
$this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
$this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), t('Basic page content type has been updated.'));
@@ -156,7 +156,7 @@ class LocaleContentTest extends WebTestBase {
// Set "Article" content type to use multilingual support.
$this->drupalGet('admin/structure/types/manage/article');
$edit = array(
- 'node_type_language_hidden' => FALSE,
+ 'language_configuration[language_hidden]' => FALSE,
);
$this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
$this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Article')), t('Article content type has been updated.'));
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php
index 00fb2b0..6dae2fe 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php
@@ -62,7 +62,7 @@ class LocaleUninstallTest extends WebTestBase {
$this->assertEqual(language(LANGUAGE_TYPE_INTERFACE)->langcode, $this->langcode, t('Current language: %lang', array('%lang' => language(LANGUAGE_TYPE_INTERFACE)->langcode)));
// Enable multilingual workflow option for articles.
- variable_set('node_type_language_hidden_article',FALSE);
+ language_save_default_configuration('node', 'article', array('language' => 'site_default', 'language_hidden' => FALSE));
// Change JavaScript translations directory.
variable_set('locale_js_directory', 'js_translations');
// Build the JavaScript translation file for French.
diff --git a/core/modules/node/content_types.inc b/core/modules/node/content_types.inc
index 88495f4..989a436 100644
--- a/core/modules/node/content_types.inc
+++ b/core/modules/node/content_types.inc
@@ -185,19 +185,6 @@ function node_type_form($form, &$form_state, $type = NULL) {
'#description' => t('Users with the Administer content permission will be able to override these options.'),
);
if (module_exists('language')) {
- $lang_options = array();
-
- $languages = language_list(LANGUAGE_ALL);
- foreach ($languages as $langcode => $language) {
- $lang_options[$langcode] = $language->locked ? t('- @name -', array('@name' => $language->name)) : $language->name;
- }
-
- $lang_options += array(
- 'site_default' => t("Site's default language"),
- 'current_interface' => t('Current interface language'),
- 'authors_default' => t("Author's preferred language"),
- );
-
$form['language'] = array(
'#type' => 'fieldset',
'#title' => t('Language settings'),
@@ -205,18 +192,16 @@ function node_type_form($form, &$form_state, $type = NULL) {
'#collapsed' => TRUE,
'#group' => 'additional_settings',
);
- $form['language']['node_type_language_default'] = array(
- '#type' => 'select',
- '#title' => t('Default language'),
- '#options' => $lang_options,
- '#default_value' => variable_get('node_type_language_default_' . $type->type, 'site_default'),
- '#description' => t('Explanation of the language options is found on the languages list page.', array('@languages_list_page' => url('admin/config/regional/language'))),
- );
- $form['language']['node_type_language_hidden'] = array(
- '#type' => 'checkbox',
- '#title' => t('Hide language selector'),
- '#default_value' => variable_get('node_type_language_hidden_' . $type->type, TRUE),
+ $language_configuration = language_get_default_configuration('node', $type->type);
+ $form['language']['language_configuration'] = array(
+ '#type' => 'language_configuration',
+ '#config' => array(
+ 'entity_type' => 'node',
+ 'bundle' => $type->type,
+ ),
+ '#default_value' => $language_configuration,
);
+ $form['#submit'][] = 'language_configuration_element_submit';
}
$form['display'] = array(
'#type' => 'fieldset',
@@ -272,6 +257,7 @@ function node_type_form($form, &$form_state, $type = NULL) {
);
}
}
+ $form['#submit'][] = 'node_type_form_submit';
return $form;
}
diff --git a/core/modules/node/content_types.js b/core/modules/node/content_types.js
index 87fc460..bce9909 100644
--- a/core/modules/node/content_types.js
+++ b/core/modules/node/content_types.js
@@ -24,7 +24,7 @@ Drupal.behaviors.contentTypes = {
$('fieldset#edit-language', context).drupalSetSummary(function(context) {
var vals = [];
- vals.push($(".form-item-node-type-language-default select option:selected", context).text());
+ vals.push($(".form-item-language-configuration-language select option:selected", context).text());
$('input:checked', context).next('label').each(function() {
vals.push(Drupal.checkPlain($(this).text()));
diff --git a/core/modules/node/lib/Drupal/node/NodeFormController.php b/core/modules/node/lib/Drupal/node/NodeFormController.php
index c5763e8..e2a446d 100644
--- a/core/modules/node/lib/Drupal/node/NodeFormController.php
+++ b/core/modules/node/lib/Drupal/node/NodeFormController.php
@@ -97,12 +97,13 @@ class NodeFormController extends EntityFormController {
$form['title']['#weight'] = -5;
}
+ $language_configuration = module_invoke('language', 'get_default_configuration', 'node', $node->type);
$form['langcode'] = array(
'#title' => t('Language'),
'#type' => 'language_select',
'#default_value' => $node->langcode,
'#languages' => LANGUAGE_ALL,
- '#access' => !variable_get('node_type_language_hidden_' . $node->type, TRUE),
+ '#access' => isset($language_configuration['language_hidden']) && !$language_configuration['language_hidden'],
);
$form['additional_settings'] = array(
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeFieldMultilingualTestCase.php b/core/modules/node/lib/Drupal/node/Tests/NodeFieldMultilingualTestCase.php
index 3b8a8ae..6f7b9c6 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeFieldMultilingualTestCase.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeFieldMultilingualTestCase.php
@@ -52,7 +52,7 @@ class NodeFieldMultilingualTestCase extends WebTestBase {
// Set "Basic page" content type to use multilingual support.
$edit = array(
- 'node_type_language_hidden' => FALSE,
+ 'language_configuration[language_hidden]' => FALSE,
);
$this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
$this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), t('Basic page content type has been updated.'));
@@ -68,7 +68,7 @@ class NodeFieldMultilingualTestCase extends WebTestBase {
*/
function testMultilingualNodeForm() {
// Create "Basic page" content.
- $langcode = node_type_get_default_langcode('page');
+ $langcode = language_get_default_langcode('node', 'page');
$title_key = "title";
$title_value = $this->randomName(8);
$body_key = "body[$langcode][0][value]";
@@ -116,7 +116,7 @@ class NodeFieldMultilingualTestCase extends WebTestBase {
*/
function testMultilingualDisplaySettings() {
// Create "Basic page" content.
- $langcode = node_type_get_default_langcode('page');
+ $langcode = language_get_default_langcode('node', 'page');
$title_key = "title";
$title_value = $this->randomName(8);
$body_key = "body[$langcode][0][value]";
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php
index 434384f..e04836c 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php
@@ -42,8 +42,8 @@ class NodeTypeInitialLanguageTest extends NodeTestBase {
*/
function testNodeTypeInitialLanguageDefaults() {
$this->drupalGet('admin/structure/types/manage/article');
- $this->assertOptionSelected('edit-node-type-language-default', 'site_default', 'The default inital language is the site default.');
- $this->assertFieldChecked('edit-node-type-language-hidden', 'Language selector is hidden by default.');
+ $this->assertOptionSelected('edit-language-configuration-language', 'site_default', 'The default inital language is the site default.');
+ $this->assertFieldChecked('edit-language-configuration-language-hidden', 'Language selector is hidden by default.');
$this->drupalGet('node/add/article');
$this->assertNoField('langcode', 'Language is not selectable on node add/edit page by default.');
@@ -59,9 +59,9 @@ class NodeTypeInitialLanguageTest extends NodeTestBase {
$this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
// Tests the initial language after changing the site default language.
- // First unhide the language selector
+ // First unhide the language selector.
$edit = array(
- 'node_type_language_hidden' => FALSE,
+ 'language_configuration[language_hidden]' => FALSE,
);
$this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
$this->drupalGet('node/add/article');
@@ -70,7 +70,7 @@ class NodeTypeInitialLanguageTest extends NodeTestBase {
// Changes the inital language settings.
$edit = array(
- 'node_type_language_default' => 'en',
+ 'language_configuration[language]' => 'en',
);
$this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
$this->drupalGet('node/add/article');
diff --git a/core/modules/node/node.install b/core/modules/node/node.install
index 5727129..79ec118 100644
--- a/core/modules/node/node.install
+++ b/core/modules/node/node.install
@@ -465,11 +465,10 @@ function node_uninstall() {
->condition('name', 'node_options_' . $type)
->condition('name', 'node_submitted_' . $type)
->condition('name', 'node_permissions_' . $type)
- ->condition('name', 'node_type_language_default_' . $type)
- ->condition('name', 'node_type_language_hidden_' . $type)
->condition('name', 'node_type_language_translation_enabled_' . $type)
)
->execute();
+ config('language.settings')->clear('language_default_configuration.node.' . $type);
}
// Delete node search ranking variables.
@@ -601,6 +600,21 @@ function node_update_8004() {
}
/**
+ * Move the language default values to config.
+ */
+function node_update_8005() {
+ $types = db_query('SELECT type FROM {node_type}')->fetchCol();
+ foreach ($types as $type) {
+ $language_default = update_variable_get('node_type_language_default_' . $type, NULL);
+ $language_hidden = update_variable_get('node_type_language_hidden_' . $type, NULL);
+ if (isset($language_default) || isset($language_hidden)) {
+ $values = array('language' => $language_default, 'language_hidden' => $language_hidden);
+ config('language.settings')->set('language_default_configuration.node.' . $type, $values)->save();
+ }
+ }
+}
+
+/**
* @} End of "addtogroup updates-7.x-to-8.x"
* The next series of updates should start at 9000.
*/
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 349aab5..71f7d39 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -667,47 +667,6 @@ function node_field_extra_fields() {
}
/**
- * Get the default language for a node type.
- *
- * @param string $node_type
- * The type of node.
- *
- * @return string
- * The language code of the node type's default langcode.
- */
-function node_type_get_default_langcode($node_type) {
- $default_value = variable_get('node_type_language_default_' . $node_type, 'site_default');
-
- $language_interface = language(LANGUAGE_TYPE_INTERFACE);
-
- if ($default_value == LANGUAGE_NOT_SPECIFIED) {
- return LANGUAGE_NOT_SPECIFIED;
- }
-
- switch ($default_value) {
- case 'site_default':
- $default_value = language_default()->langcode;
- break;
-
- case 'current_interface':
- $default_value = $language_interface->langcode;
- break;
-
- case 'authors_default':
- global $user;
- if (!empty($user->preferred_langcode)) {
- $default_value = $user->preferred_langcode;
- }
- else {
- $default_value = $language_interface->langcode;
- }
- break;
- }
-
- return $default_value;
-}
-
-/**
* Deletes a node type from the database.
*
* @param $name
diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc
index b2e1e4b..ddada14 100644
--- a/core/modules/node/node.pages.inc
+++ b/core/modules/node/node.pages.inc
@@ -89,11 +89,12 @@ function node_add($node_type) {
global $user;
$type = $node_type->type;
+ $lang_code = module_invoke('language', 'get_default_langcode', 'node', $type);
$node = entity_create('node', array(
'uid' => $user->uid,
'name' => (isset($user->name) ? $user->name : ''),
'type' => $type,
- 'langcode' => node_type_get_default_langcode($type)
+ 'langcode' => $lang_code ? $lang_code : language_default()->langcode,
));
drupal_set_title(t('Create @name', array('@name' => $node_type->name)), PASS_THROUGH);
$output = entity_get_form($node);
diff --git a/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php b/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php
index 09518ab..563dbef 100644
--- a/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php
+++ b/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php
@@ -31,7 +31,7 @@ class PathLanguageTest extends PathTestBase {
parent::setUp();
// Create and login user.
- $this->web_user = $this->drupalCreateUser(array('edit any page content', 'create page content', 'administer url aliases', 'create url aliases', 'administer languages', 'translate content', 'access administration pages'));
+ $this->web_user = $this->drupalCreateUser(array('edit any page content', 'create page content', 'administer url aliases', 'create url aliases', 'administer languages', 'translate content', 'access administration pages', 'administer content types'));
$this->drupalLogin($this->web_user);
// Enable French language.
@@ -50,7 +50,11 @@ class PathLanguageTest extends PathTestBase {
*/
function testAliasTranslation() {
// Set 'page' content type to enable translation.
- variable_set('node_type_language_hidden_page', FALSE);
+ $edit = array(
+ 'language_configuration[language_hidden]' => FALSE,
+ );
+ $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
+ $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), 'Basic page content type has been updated.');
variable_set('node_type_language_translation_enabled_page', TRUE);
$english_node = $this->drupalCreateNode(array('type' => 'page'));
diff --git a/core/modules/poll/lib/Drupal/poll/Tests/PollTranslateTest.php b/core/modules/poll/lib/Drupal/poll/Tests/PollTranslateTest.php
index 819b5f7..18dd55e 100644
--- a/core/modules/poll/lib/Drupal/poll/Tests/PollTranslateTest.php
+++ b/core/modules/poll/lib/Drupal/poll/Tests/PollTranslateTest.php
@@ -54,7 +54,7 @@ class PollTranslateTest extends PollTestBase {
// Set "Poll" content type to use multilingual support with translation.
$this->drupalGet('admin/structure/types/manage/poll');
- $edit = array('node_type_language_hidden' => FALSE, 'node_type_language_translation_enabled' => TRUE);
+ $edit = array('language_configuration[language_hidden]' => FALSE, 'node_type_language_translation_enabled' => TRUE);
$this->drupalPost('admin/structure/types/manage/poll', $edit, t('Save content type'));
$this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Poll')), t('Poll content type has been updated.'));
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
index dfa1c3f..0daca59 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
@@ -41,12 +41,13 @@ class TermFormController extends EntityFormController {
'#format' => $term->format,
'#weight' => 0,
);
-
+ $language_configuration = module_invoke('language', 'get_default_configuration', 'vocabulary', $vocabulary->machine_name);
$form['langcode'] = array(
'#type' => 'language_select',
'#title' => t('Language'),
'#languages' => LANGUAGE_ALL,
'#default_value' => $term->langcode,
+ '#access' => !is_null($language_configuration['language_hidden']) && !$language_configuration['language_hidden'],
);
$form['vocabulary_machine_name'] = array(
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermLanguageTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermLanguageTest.php
index 75bcbce..ad8b520 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermLanguageTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermLanguageTest.php
@@ -47,6 +47,12 @@ class TermLanguageTest extends TaxonomyTestBase {
);
language_save($language);
+ // Configure the vocabulary to not hide the language selector.
+ $edit = array(
+ 'default_language[language_hidden]' => FALSE,
+ );
+ $this->drupalPost('admin/structure/taxonomy/' . $this->vocabulary->machine_name . '/edit', $edit, t('Save'));
+
// Add a term.
$this->drupalGet('admin/structure/taxonomy/' . $this->vocabulary->machine_name . '/add');
// Check that we have the language selector.
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyFormController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyFormController.php
index 667041e..410a75a 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyFormController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyFormController.php
@@ -46,10 +46,24 @@ class VocabularyFormController extends EntityFormController {
);
$form['langcode'] = array(
'#type' => 'language_select',
- '#title' => t('Language'),
+ '#title' => t('Vocabulary language'),
'#languages' => LANGUAGE_ALL,
'#default_value' => $vocabulary->langcode,
);
+ if (module_exists('language')) {
+ $form['default_terms_language'] = array(
+ '#type' => 'fieldset',
+ '#title' => t('Terms language'),
+ );
+ $form['default_terms_language']['default_language'] = array(
+ '#type' => 'language_configuration',
+ '#config' => array(
+ 'entity_type' => 'vocabulary',
+ 'bundle' => $vocabulary->machine_name,
+ ),
+ '#default_value' => language_get_default_configuration('vocabulary', $vocabulary->machine_name),
+ );
+ }
// Set the hierarchy to "multiple parents" by default. This simplifies the
// vocabulary form and standardizes the term form.
$form['hierarchy'] = array(
@@ -72,6 +86,12 @@ class VocabularyFormController extends EntityFormController {
if (empty($form_state['confirm_delete'])) {
$actions = parent::actions($form, $form_state);
array_unshift($actions['delete']['#submit'], array($this, 'submit'));
+ // Add the language configuration submit handler. This is needed because
+ // the submit buttons has custom submit handlers...
+ if (module_exists('language')) {
+ array_unshift($actions['submit']['#submit'],'language_configuration_element_submit');
+ array_unshift($actions['submit']['#submit'], array($this, 'languageConfigurationSubmit'));
+ }
return $actions;
}
else {
@@ -100,6 +120,17 @@ class VocabularyFormController extends EntityFormController {
}
/**
+ * Submit handler to update the bundle for the default language configuration.
+ *
+ */
+ public function languageConfigurationSubmit(array &$form, array &$form_state) {
+ // Because the bundle is not yet known and moreover, it can be changed for a
+ // vocabulary, we have to also update the language_configuration_elements in
+ // order to have the correct bundle value.
+ $form['#language_configuration_elements']['default_language']['bundle'] = $form_state['values']['machine_name'];
+ }
+
+ /**
* Overrides Drupal\entity\EntityFormController::submit().
*/
public function submit(array $form, array &$form_state) {
diff --git a/core/modules/taxonomy/taxonomy.admin.inc b/core/modules/taxonomy/taxonomy.admin.inc
index 163c0e7..afb435f 100644
--- a/core/modules/taxonomy/taxonomy.admin.inc
+++ b/core/modules/taxonomy/taxonomy.admin.inc
@@ -108,7 +108,6 @@ function taxonomy_vocabulary_add() {
$vocabulary = entity_create('taxonomy_vocabulary', array(
// Default the new vocabulary to the site's default language. This is the
// most likely default value until we have better flexible settings.
- // @todo See http://drupal.org/node/258785 and followups.
'langcode' => language_default()->langcode,
));
return entity_get_form($vocabulary);
@@ -523,6 +522,9 @@ function theme_taxonomy_overview_terms($variables) {
*/
function taxonomy_term_add($vocabulary) {
$term = entity_create('taxonomy_term', array('vid' => $vocabulary->vid, 'vocabulary_machine_name' => $vocabulary->machine_name));
+ if (module_exists('language')) {
+ $term->langcode = language_get_default_langcode('vocabulary', $vocabulary->machine_name);
+ }
return entity_get_form($term);
}
diff --git a/core/modules/translation/lib/Drupal/translation/Tests/TranslationTest.php b/core/modules/translation/lib/Drupal/translation/Tests/TranslationTest.php
index a409150..54af7d5 100644
--- a/core/modules/translation/lib/Drupal/translation/Tests/TranslationTest.php
+++ b/core/modules/translation/lib/Drupal/translation/Tests/TranslationTest.php
@@ -50,7 +50,7 @@ class TranslationTest extends WebTestBase {
// Set "Basic page" content type to use multilingual support with
// translation.
$this->drupalGet('admin/structure/types/manage/page');
- $edit = array('node_type_language_hidden' => FALSE, 'node_type_language_translation_enabled' => TRUE);
+ $edit = array('language_configuration[language_hidden]' => FALSE, 'node_type_language_translation_enabled' => TRUE);
$this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
$this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), t('Basic page content type has been updated.'));
@@ -229,7 +229,7 @@ class TranslationTest extends WebTestBase {
// Disable translation support to check that the language switcher is left
// untouched only for new nodes.
$this->drupalLogin($this->admin_user);
- $edit = array('node_type_language_hidden' => TRUE, 'node_type_language_translation_enabled' => FALSE);
+ $edit = array('language_configuration[language_hidden]' => TRUE, 'node_type_language_translation_enabled' => FALSE);
$this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
$this->drupalLogin($this->translator);
diff --git a/core/modules/translation/translation.module b/core/modules/translation/translation.module
index 909117f..7916bec 100644
--- a/core/modules/translation/translation.module
+++ b/core/modules/translation/translation.module
@@ -136,7 +136,7 @@ function translation_form_node_type_form_alter(&$form, &$form_state) {
* and language selector is not hidden, translation cannot be enabled.
*/
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']) {
+ if (language_is_locked($form_state['values']['language_configuration']['language']) && $form_state['values']['language_configuration']['language_hidden'] && $form_state['values']['node_type_language_translation_enabled']) {
foreach (language_list(LANGUAGE_LOCKED) as $language) {
$locked_languages[] = $language->name;
}