* The TYPO3 project - inspiring people to share!
*/
+use TYPO3\CMS\Core\Log\LogManager;
+use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
use TYPO3\CMS\Core\Utility\ArrayUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
}
return $selectedLanguage;
}
+
+ /**
+ * Setting locale based on a SiteLanguage's defined locale.
+ * Used for frontend rendering, previously set within TSFE->settingLocale
+ *
+ * @param SiteLanguage $siteLanguage
+ * @return bool whether the locale was found on the system (and could be set properly) or not
+ */
+ public static function setSystemLocaleFromSiteLanguage(SiteLanguage $siteLanguage): bool
+ {
+ $locale = $siteLanguage->getLocale();
+ // No locale was given, so return false;
+ if (!$locale) {
+ return false;
+ }
+ $availableLocales = GeneralUtility::trimExplode(',', $locale, true);
+ // If LC_NUMERIC is set e.g. to 'de_DE' PHP parses float values locale-aware resulting in strings with comma
+ // as decimal point which causes problems with value conversions - so we set all locale types except LC_NUMERIC
+ // @see https://bugs.php.net/bug.php?id=53711
+ $locale = setlocale(LC_COLLATE, ...$availableLocales);
+ if ($locale) {
+ // As str_* methods are locale aware and turkish has no upper case I
+ // Class autoloading and other checks depending on case changing break with turkish locale LC_CTYPE
+ // @see http://bugs.php.net/bug.php?id=35050
+ if (strpos($locale, 'tr') !== 0) {
+ setlocale(LC_CTYPE, ...$availableLocales);
+ }
+ setlocale(LC_MONETARY, ...$availableLocales);
+ setlocale(LC_TIME, ...$availableLocales);
+ } else {
+ GeneralUtility::makeInstance(LogManager::class)
+ ->getLogger(__CLASS__)
+ ->error('Locale "' . htmlspecialchars($siteLanguage->getLocale()) . '" not found.');
+ return false;
+ }
+ return true;
+ }
}
--- /dev/null
+.. include:: ../../Includes.txt
+
+=================================================================
+Deprecation: #88473 - TypoScriptFrontendController->settingLocale
+=================================================================
+
+See :issue:`88473`
+
+Description
+===========
+
+Due to Site Handling, setting the locale information (:php:`setlocale`) can be handled
+much earlier without any dependencies on the global TSFE object.
+
+The functionality of the method :php:`TypoScriptFrontendController->settingLocale()` has
+been moved into :php:`Locales::setSystemLocaleFromSiteLanguage()`. The former method
+has been marked as deprecated.
+
+
+Impact
+======
+
+Calling :php:`TypoScriptFrontendController->settingLocale()` will trigger a PHP :php:`E_USER_DEPRECATED` error.
+
+
+Affected Installations
+======================
+
+Any TYPO3 installation with a third party extension booting up a custom Frontend system and
+explicitly call the method above.
+
+
+Migration
+=========
+
+Migrate the existing PHP code to :php:`Locales::setSystemLocaleFromSiteLanguage()` or ensure
+that the SiteResolver middleware for Frontend Requests is executed where the locale is now
+set automatically.
+
+.. index:: Frontend, PHP-API, FullyScanned
\ No newline at end of file
* The TYPO3 project - inspiring people to share!
*/
+use TYPO3\CMS\Core\Http\Uri;
use TYPO3\CMS\Core\Localization\Locales;
+use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
/**
*/
class LocalesTest extends UnitTestCase
{
+ protected $resetSingletonInstances = true;
+
+ /**
+ * @var string
+ */
+ protected $originalLocale;
+
+ protected function setUp(): void
+ {
+ parent::setUp();
+ $this->originalLocale = setlocale(LC_COLLATE, 0);
+ }
+
+ protected function tearDown(): void
+ {
+ // Restore original locale
+ setlocale(LC_COLLATE, $this->originalLocale);
+ setlocale(LC_MONETARY, $this->originalLocale);
+ setlocale(LC_TIME, $this->originalLocale);
+ parent::tearDown();
+ }
+
/**
* @return array
*/
);
$this->assertSame($expected, $detectedLanguage);
}
+
+ /**
+ * @test
+ */
+ public function setSystemLocaleFromSiteLanguageWithoutLocaleDoesNotSetLocale(): void
+ {
+ $language = new SiteLanguage(0, '', new Uri('/'), []);
+ $result = Locales::setSystemLocaleFromSiteLanguage($language);
+ static::assertFalse($result);
+ $currentLocale = setlocale(LC_COLLATE, 0);
+ // Check that the locale was not overridden
+ static::assertEquals($this->originalLocale, $currentLocale);
+ }
+
+ /**
+ * @test
+ */
+ public function setSystemLocaleFromSiteLanguageWithProperLocaleSetsLocale(): void
+ {
+ $locale = 'en_US';
+ $language = new SiteLanguage(0, $locale, new Uri('/'), []);
+ $result = Locales::setSystemLocaleFromSiteLanguage($language);
+ static::assertTrue($result);
+ $currentLocale = setlocale(LC_COLLATE, 0);
+ // Check that the locale was overridden
+ static::assertEquals($locale, $currentLocale);
+ }
+
+ /**
+ * @test
+ */
+ public function setSystemLocaleFromSiteLanguageWithInvalidLocaleDoesNotSetLocale(): void
+ {
+ $locale = 'af_EUR';
+ $language = new SiteLanguage(0, $locale, new Uri('/'), []);
+ $result = Locales::setSystemLocaleFromSiteLanguage($language);
+ static::assertFalse($result);
+ $currentLocale = setlocale(LC_COLLATE, 0);
+ // Check that the locale was not overridden
+ static::assertEquals($this->originalLocale, $currentLocale);
+ }
}
/**
* Setting locale for frontend rendering
+ * @deprecated will be removed in TYPO3 v11.0. Use Locales::setSystemLocaleFromSiteLanguage() instead.
*/
public function settingLocale()
{
+ trigger_error('TSFE->settingLocale() will be removed in TYPO3 v11.0. Use Locales::setSystemLocaleFromSiteLanguage() instead, as this functionality is independent of TSFE.', E_USER_DEPRECATED);
$siteLanguage = $this->getCurrentSiteLanguage();
- $locale = $siteLanguage->getLocale();
- if ($locale) {
- $availableLocales = GeneralUtility::trimExplode(',', $locale, true);
- // If LC_NUMERIC is set e.g. to 'de_DE' PHP parses float values locale-aware resulting in strings with comma
- // as decimal point which causes problems with value conversions - so we set all locale types except LC_NUMERIC
- // @see https://bugs.php.net/bug.php?id=53711
- $locale = setlocale(LC_COLLATE, ...$availableLocales);
- if ($locale) {
- // As str_* methods are locale aware and turkish has no upper case I
- // Class autoloading and other checks depending on case changing break with turkish locale LC_CTYPE
- // @see http://bugs.php.net/bug.php?id=35050
- if (strpos($locale, 'tr') !== 0) {
- setlocale(LC_CTYPE, ...$availableLocales);
- }
- setlocale(LC_MONETARY, ...$availableLocales);
- setlocale(LC_TIME, ...$availableLocales);
- } else {
- $this->getTimeTracker()->setTSlogMessage('Locale "' . htmlspecialchars($locale) . '" not found.', 3);
- }
+ if ($siteLanguage->getLocale() && !Locales::setSystemLocaleFromSiteLanguage($siteLanguage)) {
+ $this->getTimeTracker()->setTSlogMessage('Locale "' . htmlspecialchars($siteLanguage->getLocale()) . '" not found.', 3);
}
}
$this->controller->getConfigArray();
// Setting language and locale
- $this->timeTracker->push('Setting language and locale');
+ $this->timeTracker->push('Setting language');
$this->controller->settingLanguage();
- $this->controller->settingLocale();
$this->timeTracker->pull();
// Convert POST data to utf-8 for internal processing if metaCharset is different
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
+use TYPO3\CMS\Core\Localization\Locales;
use TYPO3\CMS\Core\Routing\SiteMatcher;
use TYPO3\CMS\Core\Routing\SiteRouteResult;
+use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
use TYPO3\CMS\Core\Site\SiteFinder;
use TYPO3\CMS\Core\Utility\GeneralUtility;
$request = $request->withAttribute('site', $routeResult->getSite());
$request = $request->withAttribute('language', $routeResult->getLanguage());
$request = $request->withAttribute('routing', $routeResult);
+ if ($routeResult->getLanguage() instanceof SiteLanguage) {
+ Locales::setSystemLocaleFromSiteLanguage($routeResult->getLanguage());
+ }
return $handler->handle($request);
}
}
{
// restore locale to original setting
setlocale(LC_COLLATE, $this->originalLocale);
+ setlocale(LC_MONETARY, $this->originalLocale);
+ setlocale(LC_TIME, $this->originalLocale);
parent::tearDown();
}
'Deprecation-88406-SetCacheHashnoCacheHashOptionsInViewHelpersAndUriBuilder.rst'
],
],
+ 'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->settingLocale' => [
+ 'numberOfMandatoryArguments' => 0,
+ 'maximumNumberOfArguments' => 0,
+ 'restFiles' => [
+ 'Deprecation-88473-TypoScriptFrontendController-settingLocale.rst'
+ ],
+ ],
];
$controller->calculateLinkVars($queryParams);
$controller->getConfigArray();
$controller->settingLanguage();
- $controller->settingLocale();
$controller->newCObj();
return $controller;
}