Translated using Weblate (Chinese (Simplified))
[phpmyadmin.git] / test / classes / LanguageTest.php
blobf7c81353cea0251d35aeeb74aa7bf4e7c1abd641
1 <?php
2 /* vim: set expandtab sw=4 ts=4 sts=4: */
3 /**
4 * tests for Advisor class
6 * @package PhpMyAdmin-test
7 */
8 declare(strict_types=1);
10 namespace PhpMyAdmin\Tests;
12 use PhpMyAdmin\LanguageManager;
13 use PhpMyAdmin\Tests\PmaTestCase;
15 /**
16 * Tests behaviour of PMA_Advisor class
18 * @package PhpMyAdmin-test
20 class LanguageTest extends PmaTestCase
22 /**
23 * @var LanguageManager
25 private $manager;
27 /**
28 * Setup for Language tests.
30 * @return void
32 protected function setUp(): void
34 $loc = LOCALE_PATH . '/cs/LC_MESSAGES/phpmyadmin.mo';
35 if (! is_readable($loc)) {
36 $this->markTestSkipped('Missing compiled locales.');
38 $this->manager = new LanguageManager();
41 /**
42 * @return void
44 protected function tearDown(): void
46 // Ensure we have English locale after tests
47 $this->manager->getLanguage('en')->activate();
50 /**
51 * Test language filtering
53 * @return void
55 public function testAvailable()
57 $GLOBALS['PMA_Config']->set('FilterLanguages', 'cs|en$');
59 $langs = $this->manager->availableLocales();
61 $this->assertCount(2, $langs);
62 $this->assertContains('cs', $langs);
63 $GLOBALS['PMA_Config']->set('FilterLanguages', '');
66 /**
67 * Test no language filtering
69 * @return void
71 public function testAllAvailable()
73 $GLOBALS['PMA_Config']->set('FilterLanguages', '');
75 $langs = $this->manager->availableLocales();
77 $this->assertContains('cs', $langs);
78 $this->assertContains('en', $langs);
81 /**
82 * Test whether listing locales works
84 * @return void
86 public function testList()
88 $langs = $this->manager->listLocaleDir();
89 $this->assertContains('cs', $langs);
90 $this->assertContains('en', $langs);
93 /**
94 * Test for getting available languages
96 * @return void
98 public function testLanguages()
100 $langs = $this->manager->availableLanguages();
101 $this->assertGreaterThan(1, count($langs));
103 /* Ensure we have name for every language */
104 foreach ($langs as $lang) {
105 $this->assertNotEquals($lang->getCode(), strtolower($lang->getEnglishName()));
110 * Test for MySQL locales
112 * @return void
114 public function testMySQLLocale()
116 $GLOBALS['PMA_Config']->set('FilterLanguages', '');
117 $czech = $this->manager->getLanguage('cs');
118 $this->assertNotFalse($czech);
119 $this->assertEquals('cs_CZ', $czech->getMySQLLocale());
121 $azerbaijani = $this->manager->getLanguage('az');
122 $this->assertNotFalse($azerbaijani);
123 $this->assertEquals('', $azerbaijani->getMySQLLocale());
127 * Test for getting available sorted languages
129 * @return void
131 public function testSortedLanguages()
133 $langs = $this->manager->sortedLanguages();
134 $this->assertGreaterThan(1, count($langs));
138 * Test getting language by code
140 * @return void
142 public function testGet()
144 $GLOBALS['PMA_Config']->set('FilterLanguages', '');
145 $lang = $this->manager->getLanguage('cs');
146 $this->assertNotEquals(false, $lang);
147 $this->assertEquals('Czech', $lang->getEnglishName());
148 $this->assertEquals('Čeština', $lang->getNativeName());
149 $lang = $this->manager->getLanguage('nonexisting');
150 $this->assertEquals(false, $lang);
154 * Test language selection
156 * @param string $lang Value for forced language
157 * @param string $post Value for language in POST
158 * @param string $get Value for language in GET
159 * @param string $cookie Value for language in COOKIE
160 * @param string $accept Value for HTTP Accept-Language header
161 * @param string $agent Value for HTTP User-Agent header
162 * @param string $default Value for default language
163 * @param string $expect Expected language name
165 * @return void
167 * @dataProvider selectDataProvider
169 public function testSelect($lang, $post, $get, $cookie, $accept, $agent, $default, $expect): void
171 $GLOBALS['PMA_Config']->set('FilterLanguages', '');
172 $GLOBALS['PMA_Config']->set('Lang', $lang);
173 $GLOBALS['PMA_Config']->set('is_https', false);
174 $_POST['lang'] = $post;
175 $_GET['lang'] = $get;
176 $_COOKIE['pma_lang'] = $cookie;
177 $_SERVER['HTTP_ACCEPT_LANGUAGE'] = $accept;
178 $_SERVER['HTTP_USER_AGENT'] = $agent;
179 $GLOBALS['PMA_Config']->set('DefaultLang', $default);
181 $lang = $this->manager->selectLanguage();
183 $this->assertEquals($expect, $lang->getEnglishName());
185 $GLOBALS['PMA_Config']->set('Lang', '');
186 $_POST['lang'] = '';
187 $_GET['lang'] = '';
188 $_COOKIE['pma_lang'] = '';
189 $_SERVER['HTTP_ACCEPT_LANGUAGE'] = '';
190 $_SERVER['HTTP_USER_AGENT'] = '';
191 $GLOBALS['PMA_Config']->set('DefaultLang', 'en');
195 * Data provider for language selection test.
197 * @return array Test parameters.
199 public function selectDataProvider()
201 return [
203 'cs',
204 'en',
210 'Czech',
214 'cs',
220 'Czech',
224 'cs',
225 'en',
230 'Czech',
235 'cs',
240 'Czech',
246 'cs',
250 'Czech',
257 'cs,en-US;q=0.7,en;q=0.3',
260 'Czech',
268 'Mozilla/5.0 (Linux; U; Android 2.2.2; tr-tr; GM FOX)',
270 'Turkish',
279 'cs',
280 'Czech',
290 'English',
296 * Test for setting and parsing locales
298 * @param string $locale locale name
300 * @return void
302 * @group large
303 * @dataProvider listLocales
305 public function testGettext($locale): void
307 $GLOBALS['PMA_Config']->set('FilterLanguages', '');
308 /* We should be able to set the language */
309 $this->manager->getLanguage($locale)->activate();
311 /* Grab some texts */
312 $this->assertStringContainsString('%s', _ngettext('%s table', '%s tables', 10));
313 $this->assertStringContainsString('%s', _ngettext('%s table', '%s tables', 1));
315 $this->assertEquals(
316 $locale,
317 $this->manager->getCurrentLanguage()->getCode()
322 * Data provider to generate list of available locales.
324 * @return array with arrays of available locales
326 public function listLocales()
328 $ret = [];
329 foreach (LanguageManager::getInstance()->availableLanguages() as $language) {
330 $ret[] = [$language->getCode()];
332 return $ret;