‪TYPO3CMS  ‪main
LocalesTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
24 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
25 
26 final class ‪LocalesTest extends UnitTestCase
27 {
28  protected bool ‪$resetSingletonInstances = true;
29 
30  protected string|bool ‪$originalLocale = false;
31 
32  protected function ‪setUp(): void
33  {
34  parent::setUp();
35  $this->originalLocale = setlocale(LC_COLLATE, 0);
36  }
37 
38  protected function ‪tearDown(): void
39  {
40  // Restore original locale
41  setlocale(LC_COLLATE, $this->originalLocale);
42  setlocale(LC_MONETARY, $this->originalLocale);
43  setlocale(LC_TIME, $this->originalLocale);
44  parent::tearDown();
45  }
46 
47  #[Test]
49  {
50  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['localization']['locales']['user'] = [
51  'fr-CG' => 'French (Congo)',
52  ];
53  $locales = new ‪Locales();
54  // Fixed defined language keys
55  self::assertTrue($locales->isValidLanguageKey('fr_CA'));
56  self::assertTrue($locales->isValidLanguageKey('fr-CA'));
57  // User-defined language keys
58  self::assertTrue($locales->isValidLanguageKey('fr-CG'));
59  self::assertTrue($locales->isValidLanguageKey('de'));
60  // Transient language key
61  self::assertTrue($locales->isValidLanguageKey('de-AT'));
62  // Deal with "en" and "en_US"
63  self::assertTrue($locales->isValidLanguageKey('en-US'));
64  self::assertTrue($locales->isValidLanguageKey('en'));
65  // valid language key "en" is automatically applied with "default"
66  self::assertTrue($locales->isValidLanguageKey('default'));
67  }
68 
69  #[Test]
71  {
72  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['localization']['locales']['user'] = [
73  'fr-CG' => 'French (Congo)',
74  ];
75  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['localization']['locales']['dependencies'] = [
76  'de-CH' => ['fr', 'es'],
77  ];
78  $locales = new ‪Locales();
79  // Automatic dependency
80  $dependencies = $locales->getLocaleDependencies('de_AT');
81  self::assertEquals(['de'], $dependencies);
82  // Explicitly defined language with 5 keys
83  $dependencies = $locales->getLocaleDependencies('pt_BR');
84  self::assertEquals(['pt'], $dependencies);
85  // Explicitly defined 2-letter custom dependency
86  $dependencies = $locales->getLocaleDependencies('lb');
87  self::assertEquals(['de'], $dependencies);
88  // Dependency with custom dependencies
89  $dependencies = $locales->getLocaleDependencies('de-CH');
90  self::assertEquals(['fr', 'es'], $dependencies);
91  // Custom registered language
92  $dependencies = $locales->getLocaleDependencies('fr_CG');
93  self::assertEquals(['fr'], $dependencies);
94  }
95 
96  public static function ‪browserLanguageDetectionWorksDataProvider(): array
97  {
98  return [
99  'german' => [
100  'de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4',
101  'de',
102  ],
103  'english as default' => [
104  'en-US;q=0.8,en;q=0.6;de-DE,de;q=0.4',
105  'default',
106  ],
107  'french canadian' => [
108  'fr-CA;q=0.8,en;q=0.6;de-DE,de;q=0.4',
109  'fr_CA',
110  ],
111  'chinese simplified' => [
112  'zh-CN,en-US;q=0.5,en;q=0.3',
113  'zh_CN',
114  ],
115  'chinese simplified han' => [
116  'zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3',
117  'zh_Hans_CN',
118  ],
119  ];
120  }
121 
122  #[DataProvider('browserLanguageDetectionWorksDataProvider')]
123  #[Test]
124  public function ‪browserLanguageDetectionWorks(string $acceptLanguageHeader, string $expected): void
125  {
126  $detectedLanguage = (new ‪Locales())->getPreferredClientLanguage(
127  $acceptLanguageHeader
128  );
129  self::assertSame($expected, $detectedLanguage);
130  }
131 
132  #[Test]
134  {
135  $site = $this->‪createSiteWithDefaultLanguage('');
136  $result = ‪Locales::setSystemLocaleFromSiteLanguage($site->getLanguageById(0));
137  self::assertFalse($result);
138  $currentLocale = setlocale(LC_COLLATE, 0);
139  // Check that the locale was not overridden
140  self::assertEquals($this->originalLocale, $currentLocale);
141  }
142 
143  #[Test]
145  {
146  $locale = 'en_US';
147  $site = $this->‪createSiteWithDefaultLanguage($locale);
148  $result = ‪Locales::setSystemLocaleFromSiteLanguage($site->getLanguageById(0));
149  self::assertTrue($result);
150  $currentLocale = setlocale(LC_COLLATE, 0);
151  // Check that the locale was overridden
152  self::assertEquals($locale, $currentLocale);
153  }
154 
155  private function ‪createSiteWithDefaultLanguage(string $locale): ‪Site
156  {
157  return new ‪Site('test', 1, [
158  'identifier' => 'test',
159  'rootPageId' => 1,
160  'base' => '/',
161  'languages' => [
162  [
163  'languageId' => 0,
164  'locale' => $locale,
165  'base' => '/',
166  ],
167  ],
168  ]);
169  }
170 }
‪TYPO3\CMS\Core\Localization\Locales\setSystemLocaleFromSiteLanguage
‪static bool setSystemLocaleFromSiteLanguage(SiteLanguage $siteLanguage)
Definition: Locales.php:308
‪TYPO3\CMS\Core\Tests\Unit\Localization\LocalesTest\isValidLanguageKeyAlsoDetectsRegionSpecificKeys
‪isValidLanguageKeyAlsoDetectsRegionSpecificKeys()
Definition: LocalesTest.php:48
‪TYPO3\CMS\Core\Tests\Unit\Localization\LocalesTest\createSiteWithDefaultLanguage
‪createSiteWithDefaultLanguage(string $locale)
Definition: LocalesTest.php:155
‪TYPO3\CMS\Core\Localization\Locales
Definition: Locales.php:36
‪TYPO3\CMS\Core\Tests\Unit\Localization\LocalesTest\setSystemLocaleFromSiteLanguageWithProperLocaleSetsLocale
‪setSystemLocaleFromSiteLanguageWithProperLocaleSetsLocale()
Definition: LocalesTest.php:144
‪TYPO3\CMS\Core\Site\Entity\Site
Definition: Site.php:42
‪TYPO3\CMS\Core\Tests\Unit\Localization\LocalesTest\setUp
‪setUp()
Definition: LocalesTest.php:32
‪TYPO3\CMS\Core\Tests\Unit\Localization\LocalesTest\$originalLocale
‪string bool $originalLocale
Definition: LocalesTest.php:30
‪TYPO3\CMS\Core\Tests\Unit\Localization\LocalesTest\getLocaleDependenciesResolvesAutomaticAndDefinedDependencies
‪getLocaleDependenciesResolvesAutomaticAndDefinedDependencies()
Definition: LocalesTest.php:70
‪TYPO3\CMS\Core\Tests\Unit\Localization\LocalesTest\browserLanguageDetectionWorksDataProvider
‪static browserLanguageDetectionWorksDataProvider()
Definition: LocalesTest.php:96
‪TYPO3\CMS\Core\Tests\Unit\Localization\LocalesTest\tearDown
‪tearDown()
Definition: LocalesTest.php:38
‪TYPO3\CMS\Core\Tests\Unit\Localization\LocalesTest\browserLanguageDetectionWorks
‪browserLanguageDetectionWorks(string $acceptLanguageHeader, string $expected)
Definition: LocalesTest.php:124
‪TYPO3\CMS\Core\Tests\Unit\Localization\LocalesTest\$resetSingletonInstances
‪bool $resetSingletonInstances
Definition: LocalesTest.php:28
‪TYPO3\CMS\Core\Tests\Unit\Localization\LocalesTest\setSystemLocaleFromSiteLanguageWithoutLocaleDoesNotSetLocale
‪setSystemLocaleFromSiteLanguageWithoutLocaleDoesNotSetLocale()
Definition: LocalesTest.php:133
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Tests\Unit\Localization
Definition: DateFormatterTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Localization\LocalesTest
Definition: LocalesTest.php:27