Merge pull request #55476 from nextcloud/fix/l10n/generic-language-no-user
Some checks are pending
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Integration sqlite / changes (push) Waiting to run
Integration sqlite / integration-sqlite (master, 8.4, main, --tags ~@large files_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, capabilities_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, collaboration_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, comments_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, dav_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, federation_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, file_conversions) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, files_reminders) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, filesdrop_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, ldap_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, openldap_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, openldap_numerical_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, remoteapi_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, routing_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, setup_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, sharees_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, sharing_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, theming_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, videoverification_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite-summary (push) Blocked by required conditions
Psalm static code analysis / static-code-analysis (push) Waiting to run
Psalm static code analysis / static-code-analysis-security (push) Waiting to run
Psalm static code analysis / static-code-analysis-ocp (push) Waiting to run
Psalm static code analysis / static-code-analysis-ncu (push) Waiting to run

fix(l10n): do not consider user language when getting the generic one
This commit is contained in:
Sebastian Krupinski 2025-11-25 10:42:56 -05:00 committed by GitHub
commit fac380fb88
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 48 additions and 91 deletions

View file

@ -228,27 +228,7 @@ class Factory implements IFactory {
return $defaultLanguage;
}
// Step 3.1: Check if Nextcloud is already installed before we try to access user info
if (!$this->config->getSystemValueBool('installed', false)) {
return 'en';
}
// Step 3.2: Check the current user (if any) for their preferred language
$user = $this->userSession->getUser();
if ($user !== null) {
$userLang = $this->config->getUserValue($user->getUID(), 'core', 'lang', null);
if ($userLang !== null) {
return $userLang;
}
}
// Step 4: Check the request headers
try {
return $this->getLanguageFromRequest($appId);
} catch (LanguageNotFoundException $e) {
// Ignore and continue
}
// Step 5: fall back to English
// Step 3: fall back to English
return 'en';
}

View file

@ -551,8 +551,24 @@ class FactoryTest extends TestCase {
self::assertSame($expected, $lang);
}
public function testFindGenericLanguageByRequestParam(): void {
$factory = $this->getFactory();
$this->request->expects(self::once())
->method('getParam')
->with('forceLanguage')
->willReturn('cz');
$lang = $factory->findGenericLanguage();
self::assertSame('cz', $lang);
}
public function testFindGenericLanguageByEnforcedLanguage(): void {
$factory = $this->getFactory();
$this->request->expects(self::once())
->method('getParam')
->with('forceLanguage')
->willReturn(null);
$this->config->expects(self::once())
->method('getSystemValue')
->with('force_language', false)
@ -565,6 +581,10 @@ class FactoryTest extends TestCase {
public function testFindGenericLanguageByDefaultLanguage(): void {
$factory = $this->getFactory(['languageExists']);
$this->request->expects(self::once())
->method('getParam')
->with('forceLanguage')
->willReturn(null);
$this->config->expects(self::exactly(2))
->method('getSystemValue')
->willReturnMap([
@ -581,83 +601,40 @@ class FactoryTest extends TestCase {
self::assertSame('cz', $lang);
}
public function testFindGenericLanguageByUserLanguage(): void {
public function testFindGenericLanguageByDefaultLanguageNotExists(): void {
$factory = $this->getFactory(['languageExists']);
$this->request->expects(self::once())
->method('getParam')
->with('forceLanguage')
->willReturn(null);
$this->config->expects(self::exactly(2))
->method('getSystemValue')
->willReturnMap([
['force_language', false, false,],
['default_language', false, 'cz',],
]);
$factory->expects(self::once())
->method('languageExists')
->with(null, 'cz')
->willReturn(false);
$lang = $factory->findGenericLanguage();
self::assertSame('en', $lang);
}
public function testFindGenericLanguageFallback(): void {
$factory = $this->getFactory();
$this->request->expects(self::once())
->method('getParam')
->with('forceLanguage')
->willReturn(null);
$this->config->expects(self::exactly(2))
->method('getSystemValue')
->willReturnMap([
['force_language', false, false,],
['default_language', false, false,],
]);
$user = $this->createMock(IUser::class);
$this->userSession->expects(self::once())
->method('getUser')
->willReturn($user);
$user->method('getUID')->willReturn('user123');
$this->config->expects(self::once())
->method('getUserValue')
->with('user123', 'core', 'lang', null)
->willReturn('cz');
$lang = $factory->findGenericLanguage();
self::assertSame('cz', $lang);
}
public function testFindGenericLanguageByRequestLanguage(): void {
$factory = $this->getFactory(['findAvailableLanguages', 'languageExists']);
$this->config->method('getSystemValue')
->willReturnMap([
['force_language', false, false,],
['default_language', false, false,],
]);
$user = $this->createMock(IUser::class);
$this->userSession->expects(self::once())
->method('getUser')
->willReturn($user);
$user->method('getUID')->willReturn('user123');
$this->config->expects(self::once())
->method('getUserValue')
->with('user123', 'core', 'lang', null)
->willReturn(null);
$this->request->expects(self::once())
->method('getHeader')
->with('ACCEPT_LANGUAGE')
->willReturn('cz');
$factory->expects(self::once())
->method('findAvailableLanguages')
->with(null)
->willReturn(['cz']);
$lang = $factory->findGenericLanguage();
self::assertSame('cz', $lang);
}
public function testFindGenericLanguageFallback(): void {
$factory = $this->getFactory(['findAvailableLanguages', 'languageExists']);
$this->config->method('getSystemValue')
->willReturnMap([
['force_language', false, false,],
['default_language', false, false,],
]);
$user = $this->createMock(IUser::class);
$this->userSession->expects(self::once())
->method('getUser')
->willReturn($user);
$user->method('getUID')->willReturn('user123');
$this->config->expects(self::once())
->method('getUserValue')
->with('user123', 'core', 'lang', null)
->willReturn(null);
$this->request->expects(self::once())
->method('getHeader')
->with('ACCEPT_LANGUAGE')
->willReturn('');
$factory->expects(self::never())
->method('findAvailableLanguages');
$factory->expects(self::never())
->method('languageExists');
$lang = $factory->findGenericLanguage();