feat: reduce available languages per config value "reduce_to_languages"

Example: restrict to en, de, es, fr, it' languages

./occ config:system:set reduce_to_languages 0  --value  en
./occ config:system:set reduce_to_languages 1  --value  de
./occ config:system:set reduce_to_languages 2  --value  es
./occ config:system:set reduce_to_languages 3  --value  fr
./occ config:system:set reduce_to_languages 4  --value  it

Signed-off-by: Misha M.-Kupriyanov <kupriyanov@strato.de>
This commit is contained in:
Misha M.-Kupriyanov
2024-03-15 10:40:54 +01:00
committed by Mikhailo Matiyenko-Kupriyanov
parent d5b7525e1f
commit aceb4d776c
3 changed files with 61 additions and 1 deletions

View File

@ -5,7 +5,7 @@
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
/**
* This configuration file is only provided to document the different
* configuration options and their usage.
@ -228,6 +228,15 @@ $CONFIG = [
*/
'default_locale' => 'en_US',
/**
* With this setting is possible to reduce the languages available in the
* language chooser. The languages have to be set as array values using ISO_639-1
* language codes such as ``en`` for English, ``de`` for German etc.
*
* For example: Set to ['de', 'fr'] to only allow German and French languages.
*/
'reduce_to_languages' => [],
/**
* This sets the default region for phone numbers on your Nextcloud server,
* using ISO 3166-1 country codes such as ``DE`` for Germany, ``FR`` for France, …

View File

@ -576,6 +576,10 @@ class Factory implements IFactory {
}
$languageCodes = $this->findAvailableLanguages();
$reduceToLanguages = $this->config->getSystemValue('reduce_to_languages', []);
if (!empty($reduceToLanguages)) {
$languageCodes = array_intersect($languageCodes, $reduceToLanguages);
}
$commonLanguages = [];
$otherLanguages = [];

View File

@ -700,6 +700,53 @@ class FactoryTest extends TestCase {
self::assertSame($expected, $result);
}
public static function dataTestReduceToLanguages(): array {
return [
['en', ['en', 'de', 'fr', 'it', 'es'], ['en', 'fr', 'de'], ['en', 'fr', 'de']],
['en', ['en', 'de', 'fr', 'it', 'es'], ['en', 'de'], ['en', 'de']],
['en', ['en', 'de', 'fr', 'it', 'es'], [], ['de', 'en', 'es', 'fr', 'it']],
];
}
/**
* test
* - if available languages set can be reduced by configuration
* - if available languages set is not reduced to an empty set if
* the reduce config is an empty set
*
* @dataProvider dataTestReduceToLanguages
*
* @param string $lang
* @param array $availableLanguages
* @param array $reducedLanguageSet
* @param array $expected
*/
public function testReduceLanguagesByConfiguration(string $lang, array $availableLanguages, array $reducedLanguageSet, array $expected): void {
$factory = $this->getFactory(['findAvailableLanguages', 'languageExists']);
$factory->expects(self::any())
->method('languageExists')->willReturn(true);
$factory->expects(self::any())
->method('findAvailableLanguages')
->willReturnCallback(function ($app) use ($availableLanguages) {
return $availableLanguages;
});
$this->config
->method('getSystemValue')
->willReturnMap([
['force_language', false, false],
['default_language', false, $lang],
['reduce_to_languages', [], $reducedLanguageSet]
]);
$result = $this->invokePrivate($factory, 'getLanguages');
$commonLanguagesCodes = array_map(function ($lang) {
return $lang['code'];
}, $result['commonLanguages']);
self::assertEqualsCanonicalizing($expected, $commonLanguagesCodes);
}
public function languageIteratorRequestProvider():array {
return [
[ true, $this->createMock(IUser::class)],