Issue #2313157 by Gábor Hojtsy: Fixed Optimize admin language detection and make it optional.

8.0.x
Nathaniel Catchpole 2014-08-07 12:03:56 +01:00
parent 381b05e5f1
commit f3b3f268dc
7 changed files with 48 additions and 39 deletions

View File

@ -90,28 +90,34 @@ interface AccountInterface {
/**
* Returns the preferred language code of the account.
*
* @param string $default
* (optional) Default language code to return if the account
* has no valid language, defaults to the site default language.
* @param bool $fallback_to_default
* (optional) Whether the return value will fall back to the site default
* language if the user has no language preference.
*
* @return string
* The language code that is preferred by the account.
* The language code that is preferred by the account. If the preferred
* language is not set or is a language not configured anymore on the site,
* the site default is returned or an empty string is returned (if
* $fallback_to_default is FALSE).
*/
public function getPreferredLangcode($default = NULL);
public function getPreferredLangcode($fallback_to_default = TRUE);
/**
* Returns the preferred administrative language code of the account.
*
* Defines which language is used on administrative pages.
*
* @param string $default
* (optional) Default language code to return if the account
* has no valid language, defaults to the site default language.
* @param bool $fallback_to_default
* (optional) Whether the return value will fall back to the site default
* language if the user has no administration language preference.
*
* @return string
* The language code that is preferred by the account.
* The language code that is preferred by the account for administration
* pages. If the preferred language is not set or is a language not
* configured anymore on the site, the site default is returned or an empty
* string is returned (if $fallback_to_default is FALSE).
*/
public function getPreferredAdminLangcode($default = NULL);
public function getPreferredAdminLangcode($fallback_to_default = TRUE);
/**
* Returns the username of this account.

View File

@ -147,15 +147,15 @@ class AccountProxy implements AccountProxyInterface {
/**
* {@inheritdoc}
*/
public function getPreferredLangcode($default = NULL) {
return $this->getAccount()->getPreferredLangcode($default);
public function getPreferredLangcode($fallback_to_default = TRUE) {
return $this->getAccount()->getPreferredLangcode($fallback_to_default);
}
/**
* {@inheritdoc}
*/
public function getPreferredAdminLangcode($default = NULL) {
return $this->getAccount()->getPreferredAdminLangcode($default);
public function getPreferredAdminLangcode($fallback_to_default = TRUE) {
return $this->getAccount()->getPreferredAdminLangcode($fallback_to_default);
}
/**

View File

@ -182,26 +182,26 @@ class UserSession implements AccountInterface {
/**
* {@inheritdoc}
*/
function getPreferredLangcode($default = NULL) {
function getPreferredLangcode($fallback_to_default = TRUE) {
$language_list = language_list();
if (!empty($this->preferred_langcode) && isset($language_list[$this->preferred_langcode])) {
return $language_list[$this->preferred_langcode]->id;
}
else {
return $default ? $default : language_default()->id;
return $fallback_to_default ? language_default()->id : '';
}
}
/**
* {@inheritdoc}
*/
function getPreferredAdminLangcode($default = NULL) {
function getPreferredAdminLangcode($fallback_to_default = TRUE) {
$language_list = language_list();
if (!empty($this->preferred_admin_langcode) && isset($language_list[$this->preferred_admin_langcode])) {
return $language_list[$this->preferred_admin_langcode]->id;
}
else {
return $default ? $default : language_default()->id;
return $fallback_to_default ? language_default()->id : '';
}
}

View File

@ -248,7 +248,7 @@ abstract class AccountForm extends ContentEntityForm {
$user_preferred_langcode = $register ? $language_interface->id : $account->getPreferredLangcode();
$user_preferred_admin_langcode = $register ? $language_interface->id : $account->getPreferredAdminLangcode();
$user_preferred_admin_langcode = $register ? $language_interface->id : $account->getPreferredAdminLangcode(FALSE);
// Is the user preferred language added?
$user_language_added = FALSE;
@ -286,6 +286,8 @@ abstract class AccountForm extends ContentEntityForm {
'#languages' => LanguageInterface::STATE_CONFIGURABLE,
'#default_value' => $user_preferred_admin_langcode,
'#access' => $show_admin_language,
'#empty_option' => $this->t('- No preference -'),
'#empty_value' => '',
);
// User entities contain both a langcode property (for identifying the
// language of the entity data) and a preferred_langcode property (see

View File

@ -366,28 +366,28 @@ class User extends ContentEntityBase implements UserInterface {
/**
* {@inheritdoc}
*/
function getPreferredLangcode($default = NULL) {
function getPreferredLangcode($fallback_to_default = TRUE) {
$language_list = language_list();
$preferred_langcode = $this->get('preferred_langcode')->value;
if (!empty($preferred_langcode) && isset($language_list[$preferred_langcode])) {
return $language_list[$preferred_langcode]->id;
}
else {
return $default ? $default : language_default()->id;
return $fallback_to_default ? language_default()->id : '';
}
}
/**
* {@inheritdoc}
*/
function getPreferredAdminLangcode($default = NULL) {
function getPreferredAdminLangcode($fallback_to_default = TRUE) {
$language_list = language_list();
$preferred_langcode = $this->get('preferred_admin_langcode')->value;
if (!empty($preferred_langcode) && isset($language_list[$preferred_langcode])) {
return $language_list[$preferred_langcode]->id;
}
else {
return $default ? $default : language_default()->id;
return $fallback_to_default ? language_default()->id : '';
}
}

View File

@ -92,17 +92,12 @@ class LanguageNegotiationUserAdmin extends LanguageNegotiationMethodBase impleme
public function getLangcode(Request $request = NULL) {
$langcode = NULL;
// User preference (only for authenticated users).
if ($this->languageManager && $this->currentUser->isAuthenticated() && $this->isAdminPath($request)) {
$preferred_admin_langcode = $this->currentUser->getPreferredAdminLangcode();
$default_langcode = $this->languageManager->getDefaultLanguage()->id;
$languages = $this->languageManager->getLanguages();
if (!empty($preferred_admin_langcode) && $preferred_admin_langcode != $default_langcode && isset($languages[$preferred_admin_langcode])) {
$langcode = $preferred_admin_langcode;
}
// User preference (only for administrators).
if ($this->currentUser->hasPermission('access administration pages') && ($preferred_admin_langcode = $this->currentUser->getPreferredAdminLangcode(FALSE)) && $this->isAdminPath($request)) {
$langcode = $preferred_admin_langcode;
}
// No language preference from the user or not on an admin path.
// Not an admin, no admin language preference or not on an admin path.
return $langcode;
}

View File

@ -118,31 +118,37 @@ class UserAdminLanguageTest extends WebTestBase {
$path = 'user/' . $this->adminUser->id() . '/edit';
$this->drupalGet($path);
$this->assertText('Language negotiation method: language-default');
$this->drupalGet('xx/' . $path);
$this->assertText('Language negotiation method: language-url');
// Set a preferred language code for the user.
$path = 'user/' . $this->adminUser->id() . '/edit';
$edit = array();
$edit['preferred_admin_langcode'] = 'xx';
$this->drupalPostForm($path, $edit, t('Save'));
// Test negotiation with the URL method first. The admin method will only
// be used if the URL method did not match.
$path = 'user/' . $this->adminUser->id() . '/edit';
$this->drupalGet($path);
$this->assertText('Language negotiation method: language-user-admin');
$path = 'xx/user/' . $this->adminUser->id() . '/edit';
$this->drupalGet($path);
$this->drupalGet('xx/' . $path);
$this->assertText('Language negotiation method: language-url');
// Test negotiation with the admin language method first. The admin method
// will be used at all times.
$this->setLanguageNegotiation(TRUE);
$path = 'user/' . $this->adminUser->id() . '/edit';
$this->drupalGet($path);
$this->assertText('Language negotiation method: language-user-admin');
$path = 'xx/user/' . $this->adminUser->id() . '/edit';
$this->drupalGet($path);
$this->drupalGet('xx/' . $path);
$this->assertText('Language negotiation method: language-user-admin');
// Unset the preferred language code for the user.
$edit = array();
$edit['preferred_admin_langcode'] = '';
$this->drupalPostForm($path, $edit, t('Save'));
$this->drupalGet($path);
$this->assertText('Language negotiation method: language-default');
$this->drupalGet('xx/' . $path);
$this->assertText('Language negotiation method: language-url');
}
/**