From 57104b4a3a7f92eabbee49297f5151c9f1083964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Sat, 2 Nov 2024 13:18:20 -0300 Subject: [PATCH 1/2] Move Language::active() to LanguageManager class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This method does not belong to the Language value object. Signed-off-by: Maurício Meneghini Fauth --- phpstan-baseline.neon | 40 ++++++++++++------------- src/Config.php | 5 ++-- src/Http/Middleware/LanguageLoading.php | 4 +-- src/I18n/Language.php | 39 ------------------------ src/I18n/LanguageManager.php | 38 +++++++++++++++++++++++ tests/unit/AbstractTestCase.php | 5 ++-- tests/unit/I18n/LanguageTest.php | 4 +-- 7 files changed, 68 insertions(+), 67 deletions(-) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index f956c4f31d..9dc9fa75f0 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -7854,26 +7854,6 @@ parameters: count: 2 path: src/Http/ServerRequest.php - - - message: "#^Cannot access offset 'a_meta_dir' on mixed\\.$#" - count: 1 - path: src/I18n/Language.php - - - - message: "#^Cannot access offset 'a_meta_language' on mixed\\.$#" - count: 1 - path: src/I18n/Language.php - - - - message: "#^Cannot access offset 'w_page' on mixed\\.$#" - count: 1 - path: src/I18n/Language.php - - - - message: "#^Parameter \\#2 \\$path of function _bindtextdomain expects string, mixed given\\.$#" - count: 1 - path: src/I18n/Language.php - - message: """ #^Call to deprecated method getInstance\\(\\) of class PhpMyAdmin\\\\Config\\: @@ -7882,6 +7862,21 @@ parameters: count: 1 path: src/I18n/LanguageManager.php + - + message: "#^Cannot access offset 'a_meta_dir' on mixed\\.$#" + count: 1 + path: src/I18n/LanguageManager.php + + - + message: "#^Cannot access offset 'a_meta_language' on mixed\\.$#" + count: 1 + path: src/I18n/LanguageManager.php + + - + message: "#^Cannot access offset 'w_page' on mixed\\.$#" + count: 1 + path: src/I18n/LanguageManager.php + - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" count: 5 @@ -7912,6 +7907,11 @@ parameters: count: 1 path: src/I18n/LanguageManager.php + - + message: "#^Parameter \\#2 \\$path of function _bindtextdomain expects string, mixed given\\.$#" + count: 1 + path: src/I18n/LanguageManager.php + - message: "#^Property PhpMyAdmin\\\\I18n\\\\LanguageManager\\:\\:\\$availableLocales \\(array\\\\) does not accept array\\|false\\.$#" count: 1 diff --git a/src/Config.php b/src/Config.php index 6cd4f51eee..5682576db5 100644 --- a/src/Config.php +++ b/src/Config.php @@ -484,10 +484,11 @@ class Config $this->setUserValue(null, 'lang', $GLOBALS['lang'], 'en'); } } elseif (isset($configData['lang'])) { + $languageManager = LanguageManager::getInstance(); // read language from settings - $language = LanguageManager::getInstance()->getLanguage($configData['lang']); + $language = $languageManager->getLanguage($configData['lang']); if ($language !== false) { - $language->activate(); + $languageManager->activate($language); $this->setCookie('pma_lang', $language->getCode()); } } diff --git a/src/Http/Middleware/LanguageLoading.php b/src/Http/Middleware/LanguageLoading.php index 9a541cf763..5451f99688 100644 --- a/src/Http/Middleware/LanguageLoading.php +++ b/src/Http/Middleware/LanguageLoading.php @@ -14,8 +14,8 @@ final class LanguageLoading implements MiddlewareInterface { public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - $language = LanguageManager::getInstance()->selectLanguage(); - $language->activate(); + $languageManager = LanguageManager::getInstance(); + $languageManager->activate($languageManager->selectLanguage()); return $handler->handle($request); } diff --git a/src/I18n/Language.php b/src/I18n/Language.php index c8317cd5fb..b009cb5318 100644 --- a/src/I18n/Language.php +++ b/src/I18n/Language.php @@ -4,15 +4,9 @@ declare(strict_types=1); namespace PhpMyAdmin\I18n; -use function __; -use function _bindtextdomain; -use function _setlocale; -use function _textdomain; use function addcslashes; -use function function_exists; use function in_array; use function preg_match; -use function setlocale; use function str_contains; use function str_replace; use function strcmp; @@ -146,37 +140,4 @@ class Language { return in_array($this->code, ['ar', 'fa', 'he', 'ur'], true); } - - /** - * Activates given translation - */ - public function activate(): void - { - $GLOBALS['lang'] = $this->code; - - // Set locale - _setlocale(0, $this->code); - _bindtextdomain('phpmyadmin', LOCALE_PATH); - _textdomain('phpmyadmin'); - // Set PHP locale as well - if (function_exists('setlocale')) { - setlocale(0, $this->code); - } - - LanguageManager::$textDirection = $this->isRTL() ? TextDirection::RightToLeft : TextDirection::LeftToRight; - - /* TCPDF */ - $GLOBALS['l'] = []; - - /* TCPDF settings */ - $GLOBALS['l']['a_meta_charset'] = 'UTF-8'; - $GLOBALS['l']['a_meta_dir'] = LanguageManager::$textDirection->value; - $GLOBALS['l']['a_meta_language'] = $this->code; - - /* TCPDF translations */ - $GLOBALS['l']['w_page'] = __('Page number:'); - - /* Show possible warnings from language selection */ - LanguageManager::getInstance()->showWarnings(); - } } diff --git a/src/I18n/LanguageManager.php b/src/I18n/LanguageManager.php index 88b6b5dacd..6f6e3dfd96 100644 --- a/src/I18n/LanguageManager.php +++ b/src/I18n/LanguageManager.php @@ -9,14 +9,19 @@ use PhpMyAdmin\Core; use PhpMyAdmin\Exceptions\UnsupportedLanguageCode; use function __; +use function _bindtextdomain; +use function _setlocale; +use function _textdomain; use function closedir; use function count; use function explode; use function file_exists; +use function function_exists; use function is_dir; use function opendir; use function preg_grep; use function readdir; +use function setlocale; use function strtolower; use function uasort; use function ucfirst; @@ -960,4 +965,37 @@ class LanguageManager throw new UnsupportedLanguageCode(__('Ignoring unsupported language code.')); } + + /** + * Activates given translation + */ + public function activate(Language $language): void + { + $GLOBALS['lang'] = $language->getCode(); + + // Set locale + _setlocale(0, $language->getCode()); + _bindtextdomain('phpmyadmin', LOCALE_PATH); + _textdomain('phpmyadmin'); + // Set PHP locale as well + if (function_exists('setlocale')) { + setlocale(0, $language->getCode()); + } + + self::$textDirection = $language->isRTL() ? TextDirection::RightToLeft : TextDirection::LeftToRight; + + /* TCPDF */ + $GLOBALS['l'] = []; + + /* TCPDF settings */ + $GLOBALS['l']['a_meta_charset'] = 'UTF-8'; + $GLOBALS['l']['a_meta_dir'] = self::$textDirection->value; + $GLOBALS['l']['a_meta_language'] = $language->getCode(); + + /* TCPDF translations */ + $GLOBALS['l']['w_page'] = __('Page number:'); + + /* Show possible warnings from language selection */ + $this->showWarnings(); + } } diff --git a/tests/unit/AbstractTestCase.php b/tests/unit/AbstractTestCase.php index eca5885ed6..f0348025b0 100644 --- a/tests/unit/AbstractTestCase.php +++ b/tests/unit/AbstractTestCase.php @@ -116,13 +116,14 @@ abstract class AbstractTestCase extends TestCase protected function setLanguage(string $code = 'en'): void { $GLOBALS['lang'] = $code; + $languageManager = LanguageManager::getInstance(); /* Ensure default language is active */ - $languageEn = LanguageManager::getInstance()->getLanguage($code); + $languageEn = $languageManager->getLanguage($code); if ($languageEn === false) { return; } - $languageEn->activate(); + $languageManager->activate($languageEn); Translator::load(); } diff --git a/tests/unit/I18n/LanguageTest.php b/tests/unit/I18n/LanguageTest.php index b24486c84d..c3a2b3f0fa 100644 --- a/tests/unit/I18n/LanguageTest.php +++ b/tests/unit/I18n/LanguageTest.php @@ -50,7 +50,7 @@ class LanguageTest extends AbstractTestCase return; } - $lang->activate(); + $this->manager->activate($lang); } /** @@ -245,7 +245,7 @@ class LanguageTest extends AbstractTestCase /* We should be able to set the language */ $lang = $this->manager->getLanguage($locale); self::assertNotFalse($lang); - $lang->activate(); + $this->manager->activate($lang); /* Grab some texts */ self::assertStringContainsString('%s', _ngettext('%s table', '%s tables', 10)); From 5258f2a4e4a7416d01981f0a5aa67ef8cbd8c51a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Sun, 3 Nov 2024 15:38:18 -0300 Subject: [PATCH 2/2] Refactor LanguageManager class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some issues reported by static analysis were fixed. Signed-off-by: Maurício Meneghini Fauth --- phpstan-baseline.neon | 37 +------ psalm-baseline.xml | 48 +++------ src/I18n/LanguageManager.php | 77 +++++++-------- ...nguageTest.php => LanguageManagerTest.php} | 99 +++++++++---------- 4 files changed, 100 insertions(+), 161 deletions(-) rename tests/unit/I18n/{LanguageTest.php => LanguageManagerTest.php} (72%) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 9dc9fa75f0..b0a4a29301 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -7863,35 +7863,10 @@ parameters: path: src/I18n/LanguageManager.php - - message: "#^Cannot access offset 'a_meta_dir' on mixed\\.$#" + message: "#^Method PhpMyAdmin\\\\I18n\\\\LanguageManager\\:\\:availableLocales\\(\\) should return array\\ but returns array\\.$#" count: 1 path: src/I18n/LanguageManager.php - - - message: "#^Cannot access offset 'a_meta_language' on mixed\\.$#" - count: 1 - path: src/I18n/LanguageManager.php - - - - message: "#^Cannot access offset 'w_page' on mixed\\.$#" - count: 1 - path: src/I18n/LanguageManager.php - - - - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" - count: 5 - path: src/I18n/LanguageManager.php - - - - message: "#^Method PhpMyAdmin\\\\I18n\\\\LanguageManager\\:\\:availableLocales\\(\\) should return array\\ but returns array\\|false\\.$#" - count: 1 - path: src/I18n/LanguageManager.php - - - - message: "#^Parameter \\#1 \\$code of method PhpMyAdmin\\\\I18n\\\\LanguageManager\\:\\:getLanguage\\(\\) expects string, mixed given\\.$#" - count: 4 - path: src/I18n/LanguageManager.php - - message: "#^Parameter \\#1 \\$directory of function opendir expects string, mixed given\\.$#" count: 1 @@ -7913,7 +7888,7 @@ parameters: path: src/I18n/LanguageManager.php - - message: "#^Property PhpMyAdmin\\\\I18n\\\\LanguageManager\\:\\:\\$availableLocales \\(array\\\\) does not accept array\\|false\\.$#" + message: "#^Property PhpMyAdmin\\\\I18n\\\\LanguageManager\\:\\:\\$availableLocales \\(array\\\\) does not accept array\\.$#" count: 1 path: src/I18n/LanguageManager.php @@ -16670,14 +16645,6 @@ parameters: count: 1 path: tests/unit/Html/MySQLDocumentationTest.php - - - message: """ - #^Call to deprecated method getInstance\\(\\) of class PhpMyAdmin\\\\Config\\: - Use dependency injection instead\\.$# - """ - count: 6 - path: tests/unit/I18n/LanguageTest.php - - message: "#^Call to static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertTrue\\(\\) with true will always evaluate to true\\.$#" count: 1 diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 2135110154..ede436d4a4 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -6156,41 +6156,25 @@ - - config->get('Lang')]]> - config->getCookie('pma_lang')]]> - + + + config->get('DefaultLang')]]]> config->get('DefaultLang')]]]> - - config->get('FilterLanguages')]]> - - - - - - - - - - - config->get('Lang')]]> - config->getCookie('pma_lang')]]> - + + + + - - - - config->get('FilterLanguages'))]]> - config->get('Lang'))]]> - config->getCookie('pma_lang'))]]> - + + + @@ -13409,17 +13393,9 @@ - - - - - - - - - + - + diff --git a/src/I18n/LanguageManager.php b/src/I18n/LanguageManager.php index 6f6e3dfd96..bf51113c40 100644 --- a/src/I18n/LanguageManager.php +++ b/src/I18n/LanguageManager.php @@ -18,6 +18,7 @@ use function explode; use function file_exists; use function function_exists; use function is_dir; +use function is_string; use function opendir; use function preg_grep; use function readdir; @@ -726,15 +727,12 @@ class LanguageManager private bool $langFailedRequest = false; - private static LanguageManager|null $instance = null; + public static LanguageManager|null $instance = null; public static TextDirection $textDirection = TextDirection::LeftToRight; - private readonly Config $config; - - public function __construct() + public function __construct(private readonly Config $config) { - $this->config = Config::getInstance(); } /** @@ -743,7 +741,7 @@ class LanguageManager public static function getInstance(): LanguageManager { if (self::$instance === null) { - self::$instance = new LanguageManager(); + self::$instance = new LanguageManager(Config::getInstance()); } return self::$instance; @@ -796,18 +794,19 @@ class LanguageManager */ public function availableLocales(): array { - if ($this->availableLocales === []) { - if (empty($this->config->get('FilterLanguages'))) { - $this->availableLocales = $this->listLocaleDir(); - } else { - $this->availableLocales = preg_grep( - '@' . $this->config->get('FilterLanguages') . '@', - $this->listLocaleDir(), - ); - } + if ($this->availableLocales !== []) { + return $this->availableLocales; } - return $this->availableLocales; + $filterLanguages = $this->config->get('FilterLanguages'); + if (! is_string($filterLanguages) || $filterLanguages === '') { + return $this->availableLocales = $this->listLocaleDir(); + } + + $locales = $this->listLocaleDir(); + $availableLocales = preg_grep('@' . $filterLanguages . '@', $locales); + + return $this->availableLocales = $availableLocales !== false ? $availableLocales : $locales; } /** @@ -883,9 +882,9 @@ class LanguageManager */ public function selectLanguage(): Language { - // check forced language - if (! empty($this->config->get('Lang'))) { - $lang = $this->getLanguage($this->config->get('Lang')); + $languageFromConfig = $this->config->get('Lang'); + if (is_string($languageFromConfig) && $languageFromConfig !== '') { + $lang = $this->getLanguage($languageFromConfig); if ($lang !== false) { return $lang; } @@ -893,10 +892,9 @@ class LanguageManager $this->langFailedConfig = true; } - // Don't use REQUEST in following code as it might be confused by cookies - // with same name. Check user requested language (POST) - if (! empty($_POST['lang'])) { - $lang = $this->getLanguage($_POST['lang']); + $languageFromRequest = $_POST['lang'] ?? null; + if (is_string($languageFromRequest) && $languageFromRequest !== '') { + $lang = $this->getLanguage($languageFromRequest); if ($lang !== false) { return $lang; } @@ -904,9 +902,9 @@ class LanguageManager $this->langFailedRequest = true; } - // check user requested language (GET) - if (! empty($_GET['lang'])) { - $lang = $this->getLanguage($_GET['lang']); + $languageFromRequest = $_GET['lang'] ?? null; + if (is_string($languageFromRequest) && $languageFromRequest !== '') { + $lang = $this->getLanguage($languageFromRequest); if ($lang !== false) { return $lang; } @@ -914,9 +912,9 @@ class LanguageManager $this->langFailedRequest = true; } - // check previous set language - if (! empty($this->config->getCookie('pma_lang'))) { - $lang = $this->getLanguage($this->config->getCookie('pma_lang')); + $languageFromCookie = $this->config->getCookie('pma_lang'); + if (is_string($languageFromCookie) && $languageFromCookie !== '') { + $lang = $this->getLanguage($languageFromCookie); if ($lang !== false) { return $lang; } @@ -955,6 +953,8 @@ class LanguageManager /** * Displays warnings about invalid languages. This needs to be postponed * to show messages at time when language is initialized. + * + * @throws UnsupportedLanguageCode */ public function showWarnings(): void { @@ -968,6 +968,8 @@ class LanguageManager /** * Activates given translation + * + * @throws UnsupportedLanguageCode */ public function activate(Language $language): void { @@ -984,16 +986,13 @@ class LanguageManager self::$textDirection = $language->isRTL() ? TextDirection::RightToLeft : TextDirection::LeftToRight; - /* TCPDF */ - $GLOBALS['l'] = []; - - /* TCPDF settings */ - $GLOBALS['l']['a_meta_charset'] = 'UTF-8'; - $GLOBALS['l']['a_meta_dir'] = self::$textDirection->value; - $GLOBALS['l']['a_meta_language'] = $language->getCode(); - - /* TCPDF translations */ - $GLOBALS['l']['w_page'] = __('Page number:'); + /* TCPDF settings and translations */ + $GLOBALS['l'] = [ + 'a_meta_charset' => 'UTF-8', + 'a_meta_dir' => self::$textDirection->value, + 'a_meta_language' => $language->getCode(), + 'w_page' => __('Page number:'), + ]; /* Show possible warnings from language selection */ $this->showWarnings(); diff --git a/tests/unit/I18n/LanguageTest.php b/tests/unit/I18n/LanguageManagerTest.php similarity index 72% rename from tests/unit/I18n/LanguageTest.php rename to tests/unit/I18n/LanguageManagerTest.php index c3a2b3f0fa..185b0ab7f5 100644 --- a/tests/unit/I18n/LanguageTest.php +++ b/tests/unit/I18n/LanguageManagerTest.php @@ -13,6 +13,7 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Large; use function _ngettext; +use function array_map; use function count; use function file_exists; use function is_readable; @@ -21,23 +22,17 @@ use function strtolower; #[CoversClass(Language::class)] #[CoversClass(LanguageManager::class)] #[Large] -class LanguageTest extends AbstractTestCase +final class LanguageManagerTest extends AbstractTestCase { - private LanguageManager $manager; - - /** - * Setup for Language tests. - */ protected function setUp(): void { parent::setUp(); - $loc = LOCALE_PATH . '/cs/LC_MESSAGES/phpmyadmin.mo'; - if (! is_readable($loc)) { - self::markTestSkipped('Missing compiled locales.'); + if (is_readable(LOCALE_PATH . '/cs/LC_MESSAGES/phpmyadmin.mo')) { + return; } - $this->manager = new LanguageManager(); + self::markTestSkipped('Missing compiled locales.'); } protected function tearDown(): void @@ -45,12 +40,18 @@ class LanguageTest extends AbstractTestCase parent::tearDown(); // Ensure we have English locale after tests - $lang = $this->manager->getLanguage('en'); - if ($lang === false) { - return; - } + $languageManager = new LanguageManager(new Config()); + $lang = $languageManager->getLanguage('en'); + self::assertNotFalse($lang); + $languageManager->activate($lang); + } - $this->manager->activate($lang); + public function testUniqueness(): void + { + LanguageManager::$instance = null; + $instanceOne = LanguageManager::getInstance(); + $instanceTwo = LanguageManager::getInstance(); + self::assertSame($instanceOne, $instanceTwo); } /** @@ -58,10 +59,10 @@ class LanguageTest extends AbstractTestCase */ public function testAvailable(): void { - $config = Config::getInstance(); + $config = new Config(); $config->set('FilterLanguages', 'cs|en$'); - $langs = $this->manager->availableLocales(); + $langs = (new LanguageManager($config))->availableLocales(); self::assertCount(2, $langs); self::assertContains('cs', $langs); @@ -73,9 +74,10 @@ class LanguageTest extends AbstractTestCase */ public function testAllAvailable(): void { - Config::getInstance()->set('FilterLanguages', ''); + $config = new Config(); + $config->set('FilterLanguages', ''); - $langs = $this->manager->availableLocales(); + $langs = (new LanguageManager($config))->availableLocales(); self::assertContains('cs', $langs); self::assertContains('en', $langs); @@ -86,7 +88,7 @@ class LanguageTest extends AbstractTestCase */ public function testList(): void { - $langs = $this->manager->listLocaleDir(); + $langs = (new LanguageManager(new Config()))->listLocaleDir(); self::assertContains('cs', $langs); self::assertContains('en', $langs); } @@ -96,7 +98,7 @@ class LanguageTest extends AbstractTestCase */ public function testLanguages(): void { - $langs = $this->manager->availableLanguages(); + $langs = (new LanguageManager(new Config()))->availableLanguages(); self::assertGreaterThan(1, count($langs)); /* Ensure we have name for every language */ @@ -115,12 +117,14 @@ class LanguageTest extends AbstractTestCase */ public function testMySQLLocale(): void { - Config::getInstance()->set('FilterLanguages', ''); - $czech = $this->manager->getLanguage('cs'); + $config = new Config(); + $config->set('FilterLanguages', ''); + $languageManager = new LanguageManager($config); + $czech = $languageManager->getLanguage('cs'); self::assertNotFalse($czech); self::assertSame('cs_CZ', $czech->getMySQLLocale()); - $azerbaijani = $this->manager->getLanguage('az'); + $azerbaijani = $languageManager->getLanguage('az'); self::assertNotFalse($azerbaijani); self::assertSame('', $azerbaijani->getMySQLLocale()); } @@ -130,7 +134,7 @@ class LanguageTest extends AbstractTestCase */ public function testSortedLanguages(): void { - $langs = $this->manager->sortedLanguages(); + $langs = (new LanguageManager(new Config()))->sortedLanguages(); self::assertGreaterThan(1, count($langs)); } @@ -139,12 +143,14 @@ class LanguageTest extends AbstractTestCase */ public function testGet(): void { - Config::getInstance()->set('FilterLanguages', ''); - $lang = $this->manager->getLanguage('cs'); + $config = new Config(); + $config->set('FilterLanguages', ''); + $languageManager = new LanguageManager($config); + $lang = $languageManager->getLanguage('cs'); self::assertNotFalse($lang); self::assertSame('Czech', $lang->getEnglishName()); self::assertSame('Čeština', $lang->getNativeName()); - $lang = $this->manager->getLanguage('nonexisting'); + $lang = $languageManager->getLanguage('nonexisting'); self::assertFalse($lang); } @@ -176,7 +182,7 @@ class LanguageTest extends AbstractTestCase self::markTestSkipped('Locale file does not exists: ' . $expect); } - $config = Config::getInstance(); + $config = new Config(); $config->set('FilterLanguages', ''); $config->set('Lang', $lang); $config->set('is_https', false); @@ -187,7 +193,7 @@ class LanguageTest extends AbstractTestCase $_SERVER['HTTP_USER_AGENT'] = $agent; $config->set('DefaultLang', $default); - $lang = $this->manager->selectLanguage(); + $lang = (new LanguageManager($config))->selectLanguage(); self::assertSame($expect, $lang->getCode()); @@ -233,42 +239,33 @@ class LanguageTest extends AbstractTestCase ]; } - /** - * Test for setting and parsing locales - * - * @param string $locale locale name - */ - #[DataProvider('listLocales')] - public function testGettext(string $locale): void + #[DataProvider('availableLocalesProvider')] + public function testSettingAndParsingLocales(string $localeCode): void { - Config::getInstance()->set('FilterLanguages', ''); + $config = new Config(); + $config->set('FilterLanguages', ''); /* We should be able to set the language */ - $lang = $this->manager->getLanguage($locale); + $languageManager = new LanguageManager($config); + $lang = $languageManager->getLanguage($localeCode); self::assertNotFalse($lang); - $this->manager->activate($lang); + $languageManager->activate($lang); /* Grab some texts */ self::assertStringContainsString('%s', _ngettext('%s table', '%s tables', 10)); self::assertStringContainsString('%s', _ngettext('%s table', '%s tables', 1)); - self::assertSame( - $locale, - $this->manager->getCurrentLanguage()->getCode(), - ); + self::assertSame($localeCode, $languageManager->getCurrentLanguage()->getCode()); } /** * Data provider to generate list of available locales. * - * @return mixed[] with arrays of available locales + * @return array */ - public static function listLocales(): array + public static function availableLocalesProvider(): array { - $ret = []; - foreach (LanguageManager::getInstance()->availableLanguages() as $language) { - $ret[] = [$language->getCode()]; - } + $availableLanguages = (new LanguageManager(new Config()))->availableLanguages(); - return $ret; + return array_map(static fn ($language) => [$language->getCode()], $availableLanguages); } }