diff --git a/core/modules/user/lib/Drupal/user/AccountFormController.php b/core/modules/user/lib/Drupal/user/AccountFormController.php index 13ad217..46c272c 100644 --- a/core/modules/user/lib/Drupal/user/AccountFormController.php +++ b/core/modules/user/lib/Drupal/user/AccountFormController.php @@ -7,6 +7,7 @@ namespace Drupal\user; +use Drupal; use Drupal\Core\Entity\EntityFormController; use Drupal\Core\Language\Language; @@ -199,13 +200,24 @@ public function form(array $form, array &$form_state) { '#description' => $interface_language_is_default ? t("This account's preferred language for e-mails and site presentation.") : t("This account's preferred language for e-mails."), ); - $form['language']['preferred_admin_langcode'] = array( - '#type' => 'language_select', - '#title' => t('Administration pages language'), - '#languages' => Language::STATE_CONFIGURABLE, - '#default_value' => $user_preferred_admin_langcode, - '#access' => user_access('access administration pages', $account), - ); + // Only show the account setting for Administration pages language to users + // if one of the detection and selection methods uses it. + if (Drupal::moduleHandler()->moduleExists('language')) { + $show_admin_language = FALSE; + foreach (language_types_info() as $type_key => $language_type) { + $negotiation_settings = variable_get("language_negotiation_{$type_key}", array()); + if ($show_admin_language = isset($negotiation_settings[LANGUAGE_NEGOTIATION_USER_ADMIN])) { + break; + } + } + $form['language']['preferred_admin_langcode'] = array( + '#type' => 'language_select', + '#title' => t('Administration pages language'), + '#languages' => Language::STATE_CONFIGURABLE, + '#default_value' => $user_preferred_admin_langcode, + '#access' => $show_admin_language && user_access('access administration pages', $account), + ); + } // User entities contain both a langcode property (for identifying the // language of the entity data) and a preferred_langcode property (see diff --git a/core/modules/user/lib/Drupal/user/Tests/UserAdminLanguageTest.php b/core/modules/user/lib/Drupal/user/Tests/UserAdminLanguageTest.php new file mode 100644 index 0000000..06a03d2 --- /dev/null +++ b/core/modules/user/lib/Drupal/user/Tests/UserAdminLanguageTest.php @@ -0,0 +1,104 @@ + 'User administration pages language settings', + 'description' => "Tests user's ability to change their administation pages language.", + 'group' => 'User', + ); + } + + /** + * Test if user can change their administration pages language. + */ + function testUserAdminLanguageConfiguration() { + global $base_url; + + // User to add and remove language. + $super_admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages')); + // User to check non-admin access. + $non_admin_user = $this->drupalCreateUser('access administration pages'); + $non_admin_user->name = 'non-admin user'; + // User to change their administration pages language. + $admin_user = $this->drupalCreateUser('access administration pages'); + $admin_user->name = 'admin user'; + + // Login as users and edit account settings. + $check_users = array($non_admin_user, $admin_user); + foreach ($check_users as $check_user) { + testUserAdminLanguageNoSetting($check_user, 'before language'); + } + + // Add custom language. + $this->drupalLogin($super_admin_user); + // Code for the language. + $langcode = 'xx'; + // The English name for the language. + $name = $this->randomName(16); + $edit = array( + 'predefined_langcode' => 'custom', + 'langcode' => $langcode, + 'name' => $name, + 'direction' => '0', + ); + $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language')); + $this->drupalLogout(); + + // Login as non-admin user and edit account settings. + testUserAdminLanguageNoSetting($non_admin_user, 'after language'); + + // Login as admin user and edit account settings. + $this->drupalLogin($admin_user); + $path = 'user/' . $admin_user->uid . '/edit'; + $this->drupalGet($path); + // Ensure administration pages language settings widget is available. + $this->assertFieldById('edit-preferred-admin-langcode', '', 'Administration pages language selector available.'); + // Ensure custom language is present. + $this->assertText($name, 'Administration pages language present on form.'); + // Switch to our custom language. + $edit = array( + 'preferred_admin_langcode' => $langcode, + ); + $this->drupalPost($path, $edit, t('Save')); + // Ensure form was submitted successfully. + $this->assertText(t('The changes have been saved.'), 'Changes were saved.'); + // Check if language was changed. + $this->assertOptionSelected('edit-preferred-admin-langcode', $langcode, 'Administration pages language successfully updated.'); + + $this->drupalLogout(); + } + + /** + * Helper function to check if administration pages language setting is not + * available. + */ + function testUserAdminLanguageNoSetting($check_user, $context) { + $context = $check_user->name . ' '. $context; + $this->drupalLogin($check_user); + $path = 'user/' . $check_user->uid . '/edit'; + $this->drupalGet($path); + // Ensure administration pages language settings widget is not available. + $this->assertNoFieldById('edit-preferred-admin-langcode', '', 'Administration pages language selector not available (' . $context . ').'); + } +}