diff --git a/typo3/sysext/backend/Classes/Controller/SiteConfigurationController.php b/typo3/sysext/backend/Classes/Controller/SiteConfigurationController.php index c5c3b1956e769aa9f04ff78731ad1c8b6a005709..175c6439992ba9307df8de0541027a498fe5423e 100644 --- a/typo3/sysext/backend/Classes/Controller/SiteConfigurationController.php +++ b/typo3/sysext/backend/Classes/Controller/SiteConfigurationController.php @@ -825,6 +825,9 @@ class SiteConfigurationController if (isset($languageConfiguration['typo3Language'])) { $existingLanguagesWithLegacyProperties[$languageConfiguration['languageId']]['typo3Language'] = $languageConfiguration['typo3Language']; } + if (isset($languageConfiguration['iso-639-1'])) { + $existingLanguagesWithLegacyProperties[$languageConfiguration['languageId']]['iso-639-1'] = $languageConfiguration['iso-639-1']; + } } foreach ($newSysSiteData['languages'] ?? [] as $key => $languageConfiguration) { $languageId = $languageConfiguration['languageId']; diff --git a/typo3/sysext/backend/Classes/Controller/SiteInlineAjaxController.php b/typo3/sysext/backend/Classes/Controller/SiteInlineAjaxController.php index bab5cccc5029723f4e4c855fc11dc905a19e4e27..b09a5a0c38db339f5fe4d7cf1e937acc322eeaad 100644 --- a/typo3/sysext/backend/Classes/Controller/SiteInlineAjaxController.php +++ b/typo3/sysext/backend/Classes/Controller/SiteInlineAjaxController.php @@ -92,11 +92,8 @@ class SiteInlineAjaxController extends AbstractFormEngineAjaxController if ($language->getTitle() !== '') { $defaultDatabaseRow['title'] = $language->getTitle(); } - if ($language->getTwoLetterIsoCode() !== '') { - $defaultDatabaseRow['iso-639-1'] = $language->getTwoLetterIsoCode(); - if ($language->getBase()->getPath() !== '/') { - $defaultDatabaseRow['base'] = '/' . $language->getTwoLetterIsoCode() . '/'; - } + if ($language->getBase()->getPath() !== '/') { + $defaultDatabaseRow['base'] = '/' . strtolower($language->getLocale()->getName()) . '/'; } if ($language->getNavigationTitle() !== '') { $defaultDatabaseRow['navigationTitle'] = $language->getNavigationTitle(); diff --git a/typo3/sysext/backend/Classes/Form/FormDataProvider/DatabaseSystemLanguageRows.php b/typo3/sysext/backend/Classes/Form/FormDataProvider/DatabaseSystemLanguageRows.php index 18b9b91928202e8c1270f2398603ad9b3a5dce78..3044b0873119382352c1746e897caaa7a4756fdc 100644 --- a/typo3/sysext/backend/Classes/Form/FormDataProvider/DatabaseSystemLanguageRows.php +++ b/typo3/sysext/backend/Classes/Form/FormDataProvider/DatabaseSystemLanguageRows.php @@ -51,7 +51,7 @@ class DatabaseSystemLanguageRows implements FormDataProviderInterface foreach ($languages as $language) { $languageId = $language->getLanguageId(); if ($languageId > 0) { - $iso = $language->getTwoLetterIsoCode(); + $iso = $language->getLocale()->getLanguageCode(); } else { $iso = 'DEF'; } @@ -74,7 +74,7 @@ class DatabaseSystemLanguageRows implements FormDataProviderInterface // @todo: since the rest of the FormEngine code does not rely on iso code? $message = sprintf( $this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:error.missingLanguageIsocode'), - $language->getTwoLetterIsoCode(), + $language->getLocale()->getLanguageCode(), $languageId ); $flashMessage = GeneralUtility::makeInstance( diff --git a/typo3/sysext/backend/Classes/Form/FormDataProvider/SiteTcaSelectItems.php b/typo3/sysext/backend/Classes/Form/FormDataProvider/SiteTcaSelectItems.php deleted file mode 100644 index 053c712e71e3e66b6481552eeefe6318f85ea0c6..0000000000000000000000000000000000000000 --- a/typo3/sysext/backend/Classes/Form/FormDataProvider/SiteTcaSelectItems.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php - -declare(strict_types=1); - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -namespace TYPO3\CMS\Backend\Form\FormDataProvider; - -use TYPO3\CMS\Backend\Form\FormDataProviderInterface; -use TYPO3\CMS\Core\Service\IsoCodeService; -use TYPO3\CMS\Core\Utility\GeneralUtility; - -/** - * Special data provider for the sites configuration module. - * - * Resolve some specialities of the "site configuration" - */ -class SiteTcaSelectItems implements FormDataProviderInterface -{ - /** - * Resolve select items for - * * 'site_language' -> 'typo3language' - * - * @throws \UnexpectedValueException - */ - public function addData(array $result): array - { - $table = $result['tableName']; - if ($table !== 'site_language') { - return $result; - } - - // Available ISO-639-1 codes fetch from service class and put as "iso-639-1" items - $isoItems = GeneralUtility::makeInstance(IsoCodeService::class)->renderIsoCodeSelectDropdown(['items' => []]); - $result['processedTca']['columns']['iso-639-1']['config']['items'] = $isoItems['items']; - - return $result; - } -} diff --git a/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaSiteLanguage.php b/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaSiteLanguage.php index 3d0405ef05a958dbf958e6969f042dc84b1229f8..db5ec3a6c2970053f562294ecc3211c2ecd02a23 100644 --- a/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaSiteLanguage.php +++ b/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaSiteLanguage.php @@ -303,9 +303,6 @@ class TcaSiteLanguage extends AbstractDatabaseRecordProvider implements FormData if ($language->getTitle() !== '') { $defaultDatabaseRow['title'] = $language->getTitle(); } - if ($language->getTwoLetterIsoCode() !== '') { - $defaultDatabaseRow['iso-639-1'] = $language->getTwoLetterIsoCode(); - } if ($language->getNavigationTitle() !== '') { $defaultDatabaseRow['navigationTitle'] = $language->getNavigationTitle(); } diff --git a/typo3/sysext/backend/Configuration/SiteConfiguration/site_language.php b/typo3/sysext/backend/Configuration/SiteConfiguration/site_language.php index 7dd89a81febdb0f7abcad095fb4a5ba7ea5c46b8..0ae47acc93a9d87cf7cf7b6ae7b4f8e02f3f4bfc 100644 --- a/typo3/sysext/backend/Configuration/SiteConfiguration/site_language.php +++ b/typo3/sysext/backend/Configuration/SiteConfiguration/site_language.php @@ -66,23 +66,13 @@ return [ 'required' => true, 'eval' => 'trim', 'size' => 20, - 'placeholder' => 'en_US.UTF-8', + 'placeholder' => 'en-US', 'valuePicker' => [ 'mode' => '', 'items' =>\TYPO3\CMS\Backend\Configuration\TCA\UserFunctions::getAllSystemLocales(), ], ], ], - 'iso-639-1' => [ - 'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.iso-639-1', - 'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site_language.iso-639-1', - 'config' => [ - 'type' => 'select', - 'renderType' => 'selectSingle', - // Fed by data provider - 'items' => [], - ], - ], 'hreflang' => [ 'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.hreflang', 'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site_language.hreflang', @@ -427,7 +417,7 @@ return [ ], 'types' => [ '1' => [ - 'showitem' => '--palette--;;default, --palette--;;locale-related, --palette--;;rendering-related, flag, --palette--;;languageIdPalette', + 'showitem' => '--palette--;;default, locale, --palette--;;rendering-related, flag, --palette--;;languageIdPalette', ], ], 'palettes' => [ @@ -438,10 +428,6 @@ return [ 'showitem' => 'languageId', 'isHiddenPalette' => true, ], - 'locale-related' => [ - 'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.palette.locales', - 'showitem' => 'locale, iso-639-1', - ], 'rendering-related' => [ 'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.palette.frontend', 'showitem' => 'websiteTitle, --linebreak--, navigationTitle, hreflang, direction, --linebreak--, fallbackType, --linebreak--, fallbacks', diff --git a/typo3/sysext/backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf b/typo3/sysext/backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf index 8d3cf23caa6a7878359a85185577901e1a56e590..bb85849144bcddf78a6c2539ec578aa772a55fe9 100644 --- a/typo3/sysext/backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf +++ b/typo3/sysext/backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf @@ -51,10 +51,6 @@ <trans-unit id="site.tab.routes" resname="site.tab.routes"> <source>Static Routes</source> </trans-unit> - - <trans-unit id="site_language.palette.locales" resname="site_language.palette.locales"> - <source>Locales</source> - </trans-unit> <trans-unit id="site_language.palette.frontend" resname="site_language.palette.frontend"> <source>Frontend related</source> </trans-unit> @@ -82,9 +78,6 @@ <trans-unit id="site_language.locale" resname="site_language.locale"> <source>Locale</source> </trans-unit> - <trans-unit id="site_language.iso-639-1" resname="site_language.iso-639-1"> - <source>Two Letter ISO Code</source> - </trans-unit> <trans-unit id="site_language.hreflang" resname="site_language.hreflang"> <source>Language Tag defined by RFC 1766 / 3066</source> </trans-unit> diff --git a/typo3/sysext/backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf b/typo3/sysext/backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf index c9d8815e4691b7b62e6ecadd944ba3a116346cca..90f9997c1738ae11563af28ac9da6b0947ea2a73 100644 --- a/typo3/sysext/backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf +++ b/typo3/sysext/backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf @@ -24,9 +24,6 @@ <trans-unit id="site_language.locale" resname="site_language.locale"> <source>Used for localized date and currency formats. E.g. "de_DE" or "en_US.UTF-8".</source> </trans-unit> - <trans-unit id="site_language.iso-639-1" resname="site_language.iso-639-1"> - <source>ISO 639-1 code of the Language</source> - </trans-unit> <trans-unit id="site_language.hreflang" resname="site_language.hreflang"> <source>Used within for "lang" and "hreflang" attributes</source> </trans-unit> diff --git a/typo3/sysext/backend/Tests/Functional/Form/FormDataProvider/TcaSelectItemsTest.php b/typo3/sysext/backend/Tests/Functional/Form/FormDataProvider/TcaSelectItemsTest.php index 2e17d76cfa78cbe730a9e6e107097faaffbfec24..06161d6ef35228f7a74e078821a8210b002c1441 100644 --- a/typo3/sysext/backend/Tests/Functional/Form/FormDataProvider/TcaSelectItemsTest.php +++ b/typo3/sysext/backend/Tests/Functional/Form/FormDataProvider/TcaSelectItemsTest.php @@ -1754,19 +1754,16 @@ class TcaSelectItemsTest extends FunctionalTestCase 'languageId' => 0, 'title' => 'Default', 'locale' => 'en_US.UTF-8', - 'iso-639-1' => 'en', ], [ 'languageId' => 1, 'title' => 'German', 'locale' => 'de_DE.UTF-8', - 'iso-639-1' => 'de', ], [ 'languageId' => 2, 'title' => 'Danish', 'locale' => 'da_DK.UTF-8', - 'iso-639-1' => 'da', ], ], ] diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseSystemLanguageRowsTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseSystemLanguageRowsTest.php index 80fe6e2eb0f38026fd8cdcb34858e153496364fa..6b03b9f98eb9e549e05ea5b865c7d7f5ee2df3ea 100644 --- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseSystemLanguageRowsTest.php +++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseSystemLanguageRowsTest.php @@ -55,15 +55,15 @@ class DatabaseSystemLanguageRowsTest extends UnitTestCase ); $siteLanguageZero = new SiteLanguage( 0, - '', + 'en', new Uri('/en/'), ['title' => 'English', 'flag' => 'empty-empty', 'direction' => 'ltr'] ); $siteLanguageOne = new SiteLanguage( 1, - '', + 'nl_NL', new Uri('/nl/'), - ['title' => 'Dutch', 'flag' => 'flag-nl', 'direction' => 'rtl', 'iso-639-1' => 'NL'] + ['title' => 'Dutch', 'flag' => 'flag-nl', 'direction' => 'rtl'] ); $siteLanguages = [ $siteLanguageMinusOne, @@ -95,7 +95,7 @@ class DatabaseSystemLanguageRowsTest extends UnitTestCase 1 => [ 'uid' => 1, 'title' => 'Dutch', - 'iso' => 'NL', + 'iso' => 'nl', 'flagIconIdentifier' => 'flag-nl', 'direction' => 'rtl', ], diff --git a/typo3/sysext/core/Classes/Configuration/SiteConfiguration.php b/typo3/sysext/core/Classes/Configuration/SiteConfiguration.php index 0dff175927b1be3ec6949eaf433352ed75c40484..0bfc63c082361a396961a1356810e2f81ea091ab 100644 --- a/typo3/sysext/core/Classes/Configuration/SiteConfiguration.php +++ b/typo3/sysext/core/Classes/Configuration/SiteConfiguration.php @@ -128,7 +128,6 @@ class SiteConfiguration implements SingletonInterface 'languageId' => 0, 'base' => '/', 'locale' => 'en_US.UTF-8', - 'iso-639-1' => 'en', 'navigationTitle' => 'English', 'hreflang' => 'en-us', 'direction' => 'ltr', diff --git a/typo3/sysext/core/Classes/Site/Entity/Site.php b/typo3/sysext/core/Classes/Site/Entity/Site.php index 1fd3ab58e33b3882a91d964946766d91d33b4394..ade7128b2562531bff9d8c88a8c55266f55beb92 100644 --- a/typo3/sysext/core/Classes/Site/Entity/Site.php +++ b/typo3/sysext/core/Classes/Site/Entity/Site.php @@ -98,7 +98,6 @@ class Site implements SiteInterface 'navigationTitle' => '', 'flag' => 'us', 'locale' => 'en_US.UTF-8', - 'iso-639-1' => 'en', 'hreflang' => 'en-US', 'direction' => '', ], diff --git a/typo3/sysext/core/Classes/Site/Entity/SiteLanguage.php b/typo3/sysext/core/Classes/Site/Entity/SiteLanguage.php index 352b03f7feb77871aff1970c2d4e9c7111494cbd..17455e6bd32f4eaeffc186cf2ac608a7c13c7bff 100644 --- a/typo3/sysext/core/Classes/Site/Entity/SiteLanguage.php +++ b/typo3/sysext/core/Classes/Site/Entity/SiteLanguage.php @@ -70,9 +70,10 @@ class SiteLanguage /** * The iso code for this language (two letter) ISO-639-1 + * @deprecated in favor of $this->locale * @var string */ - protected $twoLetterIsoCode = 'en'; + protected $twoLetterIsoCode = ''; /** * Language tag for this language defined by RFC 1766 / 3066 for "lang" @@ -188,7 +189,8 @@ class SiteLanguage 'title' => $this->getTitle(), 'websiteTitle' => $this->getWebsiteTitle(), 'navigationTitle' => $this->getNavigationTitle(), - 'twoLetterIsoCode' => $this->getTwoLetterIsoCode(), + // @deprecated will be removed in TYPO3 v13.0 + 'twoLetterIsoCode' => $this->twoLetterIsoCode ?: $this->locale->getLanguageCode(), 'hreflang' => $this->getHreflang(), 'direction' => $this->getDirection(), 'typo3Language' => $this->getTypo3Language(), @@ -258,10 +260,12 @@ class SiteLanguage /** * Returns the ISO-639-1 language ISO code + * @deprecated not needed anymore, use $this->getLocale()->getLanguageCode() instead. */ public function getTwoLetterIsoCode(): string { - return $this->twoLetterIsoCode; + trigger_error('SiteLanguage->getTwoLetterIsoCode() will be removed in TYPO3 v13.0. User SiteLanguage->getLocale()->getLanguageCode() instead.', E_USER_DEPRECATED); + return $this->twoLetterIsoCode ?: $this->locale->getLanguageCode(); } /** diff --git a/typo3/sysext/core/Configuration/DefaultConfiguration.php b/typo3/sysext/core/Configuration/DefaultConfiguration.php index a89e7c9cef60f8c2de35ab8f918e962758576a19..c8f7ca985ec371ed28a14bf43ac799fe45d358ba 100644 --- a/typo3/sysext/core/Configuration/DefaultConfiguration.php +++ b/typo3/sysext/core/Configuration/DefaultConfiguration.php @@ -1172,11 +1172,6 @@ return [ \TYPO3\CMS\Backend\Form\FormDataProvider\TcaGroup::class, ], ], - \TYPO3\CMS\Backend\Form\FormDataProvider\SiteTcaSelectItems::class => [ - 'depends' => [ - \TYPO3\CMS\Backend\Form\FormDataProvider\TcaFolder::class, - ], - ], \TYPO3\CMS\Backend\Form\FormDataProvider\TcaSelectItems::class => [ 'depends' => [ \TYPO3\CMS\Backend\Form\FormDataProvider\DatabasePageRootline::class, @@ -1185,7 +1180,6 @@ return [ \TYPO3\CMS\Backend\Form\FormDataProvider\TcaTypesShowitem::class, \TYPO3\CMS\Backend\Form\FormDataProvider\TcaColumnsRemoveUnused::class, \TYPO3\CMS\Backend\Form\FormDataProvider\TcaCheckboxItems::class, - \TYPO3\CMS\Backend\Form\FormDataProvider\SiteTcaSelectItems::class, ], ], \TYPO3\CMS\Backend\Form\FormDataProvider\TcaInlineConfiguration::class => [ diff --git a/typo3/sysext/core/Documentation/Changelog/12.3/Deprecation-99905-SiteLanguageIso-639-1Setting.rst b/typo3/sysext/core/Documentation/Changelog/12.3/Deprecation-99905-SiteLanguageIso-639-1Setting.rst new file mode 100644 index 0000000000000000000000000000000000000000..b3fecff592539e63161db7c1736ced70de4a91d0 --- /dev/null +++ b/typo3/sysext/core/Documentation/Changelog/12.3/Deprecation-99905-SiteLanguageIso-639-1Setting.rst @@ -0,0 +1,67 @@ +.. include:: /Includes.rst.txt + +.. _deprecation-99905-1675963182: + +======================================================= +Deprecation: #99905 - Site Language "iso-639-1" setting +======================================================= + +See :issue:`99905` + +Description +=========== + +A language configuration defined for a site has had various settings, one of +them being "iso-639-1" (also known as "twoLetterIsoCode"). + +This setting was previously introduced to define the actual ISO 639-1 code, which +was different from the Locale or the "typo3Language" setting. However, +this information can now properly retrieved from the method: +:php:`SiteLanguage->getLocale()->getLanguageCode()`. + +Since TYPO3 v12 it is not needed to set this property in the site configuration +anymore, and it is removed from the Backend UI. The information is now automatically +derived from the Locale setting of the Site Configuration. + +This property originally came from an option in TypoScript called +:typoscript:`config.sys_language_isocode` which in turn was created in favor of +the previous `sys_language` database table. TYPO3 Core never evaluated this +setting properly before TYPO3 v9. + +As a result, the amount of options in the User Interface for integrators is +reduced. + +The PHP method :php:`SiteLanguage->getTwoLetterIsoCode()` serves now purpose +anymore and is deprecated. + +This also affects the TypoScript "getData" property :typoscript:`siteLanguage:twoLetterIsoCode`, +and the TypoScript condition :typoscript:`[siteLanguage("twoLetterIsoCode")]`. + + +Impact +====== + +Using the TypoScript settings or the PHP method will trigger a PHP deprecation notice. + +An Administrator can not select a value for the "iso-639-1" setting anymore +via the TYPO3 Backend. However, when saving a site configuration via the +TYPO3 Backend will still keep the "iso-639-1" setting so no information is lost. + + +Affected installations +====================== + +TYPO3 installation actively accessing this property via PHP or TypoScript. + + +Migration +========= + +No migration is needed as the explicit option is still evaluated. It is however +recommended to evaluate if the setting is really needed, and if the first part of the +`locale` setting matches the `iso-639-1` setting. If so, the line with `iso-639-1` can be removed. + +As for TypoScript, it is recommended to use :typoscript:`siteLanguage:locale:languageCode` +instead of :typoscript:`siteLanguage:twoLetterIsoCode`. + +.. index:: PHP-API, TypoScript, YAML, PartiallyScanned, ext:frontend diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Site/SiteModuleCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Site/SiteModuleCest.php index bbe2b3f4208406efc93363c54c9f9f9451184b91..150c346c84ccadd7bf1c6c6c29b03f24f8a35c72 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/Site/SiteModuleCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/Site/SiteModuleCest.php @@ -84,8 +84,7 @@ final class SiteModuleCest $I->canSee('[New language]'); $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[title]")]', 'New Language'); $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[base]")]', '/new-language/'); - $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[locale]")]', 'C'); - $I->selectOption('//select[contains(@name, "[site_language]") and contains(@name, "[iso-639-1]")]', 'hr'); + $I->fillField('//input[contains(@data-formengine-input-name, "data[site_language]") and contains(@data-formengine-input-name, "[locale]")]', 'hr_HR'); $I->amGoingTo('Save the site configuration'); $I->waitForElement($saveButtonLink, 30); @@ -93,7 +92,7 @@ final class SiteModuleCest $I->waitForElementNotVisible('#t3js-ui-block'); $I->amGoingTo('Verify new site configuration has been added with the next available language ID)'); - $I->canSee('New Language [9] (C)'); + $I->canSee('New Language [9] (hr_HR)'); $I->amGoingTo('Close the site configuration form'); $I->click('Close'); @@ -116,9 +115,9 @@ final class SiteModuleCest $I->selectOption('.t3js-create-new-selector', '9'); $I->waitForElementVisible('div.inlineIsNewRecord:nth-child(2)'); $I->scrollTo('div.inlineIsNewRecord:nth-child(2)'); - $I->canSee('New Language [9] (C)'); + $I->canSee('New Language [9] (hr_HR)'); $I->click('div.inlineIsNewRecord:nth-child(2) > div:nth-child(1) > div:nth-child(1)'); - $I->canSee('/hr/'); + $I->canSee('/hr-hr/'); $I->click('div.inlineIsNewRecord:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) button'); $modalDialog->canSeeDialog(); $I->click('button[name="yes"]', ModalDialog::$openedModalButtonContainerSelector); diff --git a/typo3/sysext/core/Tests/Functional/DataHandling/AbstractDataHandlerActionTestCase.php b/typo3/sysext/core/Tests/Functional/DataHandling/AbstractDataHandlerActionTestCase.php index e0db566612ed99205a77e11f5e56c97daff2cc8f..264e7476844f0ef33113d3de9eec6aa605cab601 100644 --- a/typo3/sysext/core/Tests/Functional/DataHandling/AbstractDataHandlerActionTestCase.php +++ b/typo3/sysext/core/Tests/Functional/DataHandling/AbstractDataHandlerActionTestCase.php @@ -70,7 +70,6 @@ abstract class AbstractDataHandlerActionTestCase extends FunctionalTestCase 'languageId' => 1, 'base' => '/dk/', 'locale' => 'da_DK.UTF-8', - 'iso-639-1' => 'da', 'flag' => 'dk', 'fallbackType' => 'fallback', 'fallbacks' => '0', @@ -81,7 +80,6 @@ abstract class AbstractDataHandlerActionTestCase extends FunctionalTestCase 'languageId' => 2, 'base' => '/de/', 'locale' => 'de_DE.UTF-8', - 'iso-639-1' => 'de', 'flag' => 'de', 'fallbackType' => 'fallback', 'fallbacks' => '1,0', @@ -123,7 +121,6 @@ abstract class AbstractDataHandlerActionTestCase extends FunctionalTestCase 'languageId' => 0, 'base' => '/', 'locale' => 'en_US.UTF-8', - 'iso-639-1' => 'en', 'navigationTitle' => '', 'hreflang' => '', 'direction' => '', diff --git a/typo3/sysext/core/Tests/Functional/DataHandling/Regular/Hooks/PagesTsConfigGuardTest.php b/typo3/sysext/core/Tests/Functional/DataHandling/Regular/Hooks/PagesTsConfigGuardTest.php index e93d6901be70790368e101ec6fd62db7869e4311..a83c31a6e63e6190a29f4aeb654465da1488b994 100644 --- a/typo3/sysext/core/Tests/Functional/DataHandling/Regular/Hooks/PagesTsConfigGuardTest.php +++ b/typo3/sysext/core/Tests/Functional/DataHandling/Regular/Hooks/PagesTsConfigGuardTest.php @@ -118,7 +118,6 @@ class PagesTsConfigGuardTest extends FunctionalTestCase 'languageId' => 0, 'base' => '/', 'locale' => 'en_US.UTF-8', - 'iso-639-1' => 'en', 'navigationTitle' => '', 'hreflang' => '', 'direction' => '', diff --git a/typo3/sysext/core/Tests/Functional/DataHandling/Slug/SlugHelperTest.php b/typo3/sysext/core/Tests/Functional/DataHandling/Slug/SlugHelperTest.php index 894ccc57aebb9794b6ef7ced79ff24b1ab88329b..bdea480a2db63b89f071ec5826a4cc0766dfe8c9 100644 --- a/typo3/sysext/core/Tests/Functional/DataHandling/Slug/SlugHelperTest.php +++ b/typo3/sysext/core/Tests/Functional/DataHandling/Slug/SlugHelperTest.php @@ -37,7 +37,6 @@ class SlugHelperTest extends AbstractDataHandlerActionTestCase 'languageId' => 1, 'base' => '/dk/', 'locale' => 'da_DK.UTF-8', - 'iso-639-1' => 'da', 'flag' => 'dk', 'fallbackType' => 'fallback', 'fallbacks' => '0', @@ -48,7 +47,6 @@ class SlugHelperTest extends AbstractDataHandlerActionTestCase 'languageId' => 2, 'base' => '/de/', 'locale' => 'de_DE.UTF-8', - 'iso-639-1' => 'de', 'flag' => 'de', 'fallbackType' => 'fallback', 'fallbacks' => '0', @@ -59,7 +57,6 @@ class SlugHelperTest extends AbstractDataHandlerActionTestCase 'languageId' => 3, 'base' => '/de-ch/', 'locale' => 'de_CH.UTF-8', - 'iso-639-1' => 'de', 'flag' => 'ch', 'fallbackType' => 'fallback', 'fallbacks' => '2,0', diff --git a/typo3/sysext/core/Tests/Functional/DataScenarios/AbstractDataHandlerActionTestCase.php b/typo3/sysext/core/Tests/Functional/DataScenarios/AbstractDataHandlerActionTestCase.php index de1cea89febe20c0ca9646d6b7ec4cc6248a0a9e..59d8367f910bcee34fdf9632cf57f9918d7ccde7 100644 --- a/typo3/sysext/core/Tests/Functional/DataScenarios/AbstractDataHandlerActionTestCase.php +++ b/typo3/sysext/core/Tests/Functional/DataScenarios/AbstractDataHandlerActionTestCase.php @@ -70,7 +70,6 @@ abstract class AbstractDataHandlerActionTestCase extends FunctionalTestCase 'languageId' => 1, 'base' => '/dk/', 'locale' => 'da_DK.UTF-8', - 'iso-639-1' => 'da', 'flag' => 'dk', 'fallbackType' => 'fallback', 'fallbacks' => '0', @@ -81,7 +80,6 @@ abstract class AbstractDataHandlerActionTestCase extends FunctionalTestCase 'languageId' => 2, 'base' => '/de/', 'locale' => 'de_DE.UTF-8', - 'iso-639-1' => 'de', 'flag' => 'de', 'fallbackType' => 'fallback', 'fallbacks' => '1,0', @@ -123,7 +121,6 @@ abstract class AbstractDataHandlerActionTestCase extends FunctionalTestCase 'languageId' => 0, 'base' => '/', 'locale' => 'en_US.UTF-8', - 'iso-639-1' => 'en', 'navigationTitle' => '', 'hreflang' => '', 'direction' => '', diff --git a/typo3/sysext/core/Tests/Functional/SiteHandling/SiteBasedTestTrait.php b/typo3/sysext/core/Tests/Functional/SiteHandling/SiteBasedTestTrait.php index 30e84d08048714970d0947311f240c76d8a202db..47befee7e7e2ca3ba03dff7e193cef3d23c33cf1 100644 --- a/typo3/sysext/core/Tests/Functional/SiteHandling/SiteBasedTestTrait.php +++ b/typo3/sysext/core/Tests/Functional/SiteHandling/SiteBasedTestTrait.php @@ -127,7 +127,6 @@ trait SiteBasedTestTrait 'navigationTitle' => $preset['title'], 'base' => $base, 'locale' => $preset['locale'], - 'iso-639-1' => $preset['iso'] ?? '', 'hreflang' => $preset['hrefLang'] ?? '', 'direction' => $preset['direction'] ?? '', 'flag' => $preset['iso'] ?? '', diff --git a/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config1.yaml b/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config1.yaml index 0e88fb572947e95ccb9d042cbce7045b87fad6e7..6d8278de16c0c93a94b2c8c22a26e93d145a4148 100644 --- a/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config1.yaml +++ b/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config1.yaml @@ -16,7 +16,6 @@ languages: languageId: '0' base: /en locale: en_US.utf8 - iso-639-1: en hreflang: '' direction: '' flag: bv @@ -27,7 +26,6 @@ languages: languageId: '1' base: /da locale: da_DK.utf8 - iso-639-1: da hreflang: '' direction: '' flag: da diff --git a/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config1_expected.yaml b/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config1_expected.yaml index 5ad310305c8d8067fa31e6c28b27a4642c5a967d..037f7d48da51d558e5c0438734ba4ddb7b6a6ac0 100644 --- a/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config1_expected.yaml +++ b/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config1_expected.yaml @@ -15,7 +15,6 @@ languages: languageId: '0' base: /en locale: en_US.utf8 - iso-639-1: en hreflang: '' direction: '' flag: bv diff --git a/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config2.yaml b/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config2.yaml index aa665df0563b7aba72106633cab8aa8bac1207eb..265b26e535233c0750d6ed2c16fdb6ff645269dd 100644 --- a/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config2.yaml +++ b/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config2.yaml @@ -16,7 +16,6 @@ languages: languageId: '1' base: /da locale: da_DK.utf8 - iso-639-1: da hreflang: '' direction: '' flag: da diff --git a/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config2_expected.yaml b/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config2_expected.yaml index bd9e38e30777c932043a78c9c9c8c0a51263d9f4..97e63c279121f2355e1882142940a696d6847af5 100644 --- a/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config2_expected.yaml +++ b/typo3/sysext/core/Tests/Unit/Configuration/Fixtures/SiteConfigs/config2_expected.yaml @@ -16,7 +16,6 @@ languages: languageId: '0' base: /en locale: en_US.utf8 - iso-639-1: en hreflang: '' direction: '' flag: en @@ -27,7 +26,6 @@ languages: languageId: '1' base: /da locale: da_DK.utf8 - iso-639-1: da hreflang: '' direction: '' flag: da diff --git a/typo3/sysext/core/Tests/Unit/Configuration/SiteConfigurationTest.php b/typo3/sysext/core/Tests/Unit/Configuration/SiteConfigurationTest.php index 2eaff4b3ef126f6df6ec549157dab3d583d0f61c..0aacc54927c2a47769e91c9ef566142ec2f3018a 100644 --- a/typo3/sysext/core/Tests/Unit/Configuration/SiteConfigurationTest.php +++ b/typo3/sysext/core/Tests/Unit/Configuration/SiteConfigurationTest.php @@ -139,7 +139,6 @@ class SiteConfigurationTest extends UnitTestCase 'languageId' => '0', 'base' => '/en', 'locale' => 'en_US.utf8', - 'iso-639-1' => 'en', 'hreflang' => '', 'direction' => '', 'flag' => 'en', diff --git a/typo3/sysext/core/Tests/Unit/Site/Entity/SiteLanguageTest.php b/typo3/sysext/core/Tests/Unit/Site/Entity/SiteLanguageTest.php index ff0fb0989f4d3c5096a44401f7a3e7bb6a3e5e69..a680b795f4ecb218f756cf402215aa343dc2957e 100644 --- a/typo3/sysext/core/Tests/Unit/Site/Entity/SiteLanguageTest.php +++ b/typo3/sysext/core/Tests/Unit/Site/Entity/SiteLanguageTest.php @@ -97,7 +97,7 @@ class SiteLanguageTest extends UnitTestCase 'base' => '/', 'title' => 'Default', 'websiteTitle' => '', - 'twoLetterIsoCode' => 'en', + 'twoLetterIsoCode' => 'de', 'hreflang' => '', 'direction' => '', 'typo3Language' => 'de', diff --git a/typo3/sysext/form/Classes/Controller/FormEditorController.php b/typo3/sysext/form/Classes/Controller/FormEditorController.php index 98e5058b2d4b21c44f5d97e98230ddaa6636729a..07f7b8ca01d49dce01e1adafdbfc756b85591076 100644 --- a/typo3/sysext/form/Classes/Controller/FormEditorController.php +++ b/typo3/sysext/form/Classes/Controller/FormEditorController.php @@ -291,7 +291,6 @@ class FormEditorController extends AbstractBackendController 'navigationTitle' => '', 'flag' => '', 'locale' => '', - 'iso-639-1' => '', 'hreflang' => '', 'direction' => '', ], diff --git a/typo3/sysext/form/Classes/Domain/Runtime/FormRuntime.php b/typo3/sysext/form/Classes/Domain/Runtime/FormRuntime.php index 5d9068ff4558dc37d8dd4b63d4e1b66902bb0012..1be3650e6c31a549f3535a928cc9ee9c7590821b 100644 --- a/typo3/sysext/form/Classes/Domain/Runtime/FormRuntime.php +++ b/typo3/sysext/form/Classes/Domain/Runtime/FormRuntime.php @@ -1049,7 +1049,6 @@ class FormRuntime implements RootRenderableInterface, \ArrayAccess 'navigationTitle' => '', 'flag' => '', 'locale' => '', - 'iso-639-1' => '', 'hreflang' => '', 'direction' => '', ], diff --git a/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php b/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php index d62d14cc8433b5c3e4d6341ec31272f9599879db..6e937613785e2886361c7a3477f4e105f0e82323 100644 --- a/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php +++ b/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php @@ -4139,9 +4139,33 @@ class ContentObjectRenderer implements LoggerAwareInterface break; case 'sitelanguage': $siteLanguage = $this->getTypoScriptFrontendController()->getLanguage(); - $config = $siteLanguage->toArray(); - if (isset($config[$key])) { - $retVal = $config[$key] ?? ''; + if ($key === 'twoLetterIsoCode') { + $key = 'locale:languageCode'; + } + // Special handling for the locale object + if (str_starts_with($key, 'locale')) { + $localeObject = $siteLanguage->getLocale(); + if ($key === 'locale') { + // backwards-compatibility + $retVal = $localeObject->posixFormatted(); + } else { + $keyParts = explode(':', $key, 2); + switch ($keyParts[1] ?? '') { + case 'languageCode': + $retVal = $localeObject->getLanguageCode(); + break; + case 'countryCode': + $retVal = $localeObject->getCountryCode(); + break; + default: + $retVal = $localeObject->getName(); + } + } + } else { + $config = $siteLanguage->toArray(); + if (isset($config[$key])) { + $retVal = $config[$key] ?? ''; + } } break; case 'sitesettings': diff --git a/typo3/sysext/frontend/Tests/Functional/Rendering/TitleTagRenderingTest.php b/typo3/sysext/frontend/Tests/Functional/Rendering/TitleTagRenderingTest.php index 47c4303c0738e837a41fea8ddd7c1d7732c1ace8..e8633cc52132d35c7b5191c2dd4b24064652a6c1 100644 --- a/typo3/sysext/frontend/Tests/Functional/Rendering/TitleTagRenderingTest.php +++ b/typo3/sysext/frontend/Tests/Functional/Rendering/TitleTagRenderingTest.php @@ -62,7 +62,6 @@ class TitleTagRenderingTest extends FunctionalTestCase 'languageId' => '0', 'base' => '/', 'locale' => 'en_US.UTF-8', - 'iso-639-1' => 'en', 'websiteTitle' => 'Site EN', 'navigationTitle' => '', 'hreflang' => '', diff --git a/typo3/sysext/frontend/Tests/Functional/SiteHandling/EnhancerLinkGenerator/RouteTest.php b/typo3/sysext/frontend/Tests/Functional/SiteHandling/EnhancerLinkGenerator/RouteTest.php index 150a700c018cecfad0410479db8259376d4ba1ec..fb46bb04944eed68bc52618257b450ef07355602 100644 --- a/typo3/sysext/frontend/Tests/Functional/SiteHandling/EnhancerLinkGenerator/RouteTest.php +++ b/typo3/sysext/frontend/Tests/Functional/SiteHandling/EnhancerLinkGenerator/RouteTest.php @@ -85,7 +85,7 @@ class RouteTest extends AbstractEnhancerLinkGeneratorTestCase ], 'localeMap' => [ [ - 'locale' => 'fr_FR', + 'locale' => 'fr-FR', 'map' => [ 'cent' => 100, ], @@ -180,7 +180,7 @@ class RouteTest extends AbstractEnhancerLinkGeneratorTestCase ], 'localeMap' => [ [ - 'locale' => 'fr_FR', + 'locale' => 'fr-FR', 'map' => [ 'cent' => 100, ], diff --git a/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php b/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php index 033dfb1117065cfc4a43058df73234745822fcdb..a1d463ba88b6fdc84847acc83cdfe3cf4e8efd41 100644 --- a/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php +++ b/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php @@ -1576,6 +1576,8 @@ class ContentObjectRendererTest extends UnitTestCase $language = $site->getLanguageById(1); $this->frontendControllerMock->_set('language', $language); self::assertEquals('German', $this->subject->getData('siteLanguage:navigationTitle')); + self::assertEquals('de', $this->subject->getData('siteLanguage:twoLetterIsoCode')); + self::assertEquals('de', $this->subject->getData('siteLanguage:locale:languageCode')); } /** diff --git a/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php b/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php index c658d05abf08bde21a12a3a4d95228f9dc032fc2..6c63e6fe8119f3d13cc0465f505028ac6839de6f 100644 --- a/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php +++ b/typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php @@ -5491,4 +5491,11 @@ return [ 'Deprecation-99685-RemoveLineBreaksFromTemplate.rst', ], ], + 'TYPO3\CMS\Core\Site\Entity\SiteLanguage->getTwoLetterIsoCode' => [ + 'numberOfMandatoryArguments' => 0, + 'maximumNumberOfArguments' => 0, + 'restFiles' => [ + 'Deprecation-99905-SiteLanguageIso-639-1Setting.rst', + ], + ], ]; diff --git a/typo3/sysext/install/Tests/Functional/Updates/MigrateSiteSettingsConfigUpdateTest.php b/typo3/sysext/install/Tests/Functional/Updates/MigrateSiteSettingsConfigUpdateTest.php index 69f8b3a2554ce0a15eb1ff4028058b14676402a0..a7bc381b7616fd660a8973f625d23fd90292510f 100644 --- a/typo3/sysext/install/Tests/Functional/Updates/MigrateSiteSettingsConfigUpdateTest.php +++ b/typo3/sysext/install/Tests/Functional/Updates/MigrateSiteSettingsConfigUpdateTest.php @@ -44,7 +44,6 @@ class MigrateSiteSettingsConfigUpdateTest extends FunctionalTestCase 'languageId' => 0, 'base' => '/', 'locale' => 'en_US.UTF-8', - 'iso-639-1' => 'en', 'navigationTitle' => 'English', 'hreflang' => 'en-us', 'direction' => 'ltr', @@ -84,7 +83,6 @@ class MigrateSiteSettingsConfigUpdateTest extends FunctionalTestCase 'languageId' => 0, 'base' => '/', 'locale' => 'en_US.UTF-8', - 'iso-639-1' => 'en', 'navigationTitle' => 'English', 'hreflang' => 'en-us', 'direction' => 'ltr', diff --git a/typo3/sysext/linkvalidator/Classes/Result/LinkAnalyzerResult.php b/typo3/sysext/linkvalidator/Classes/Result/LinkAnalyzerResult.php index e89a39d55380b525caac5062b600621c4182dff0..f2237eea17292cf1ac62a5f1738619dc17f18d1e 100644 --- a/typo3/sysext/linkvalidator/Classes/Result/LinkAnalyzerResult.php +++ b/typo3/sysext/linkvalidator/Classes/Result/LinkAnalyzerResult.php @@ -204,7 +204,7 @@ class LinkAnalyzerResult try { $site = GeneralUtility::makeInstance(SiteFinder::class)->getSiteByPageId((int)$brokenLink['real_pid']); - $languageCode = $site->getLanguageById((int)$brokenLink['language'])->getTwoLetterIsoCode() ?: 'default'; + $languageCode = $site->getLanguageById((int)$brokenLink['language'])->getLocale()->getLanguageCode(); } catch (SiteNotFoundException | \InvalidArgumentException $e) { $languageCode = 'default'; } @@ -214,7 +214,7 @@ class LinkAnalyzerResult $brokenLink['record_type'] = $this->getLanguageService()->sL($GLOBALS['TCA'][$brokenLink['table_name']]['ctrl']['title'] ?? ''); $brokenLink['target'] = (((string)($brokenLink['link_type'] ?? '') === 'db') ? 'id:' : '') . $brokenLink['url']; - $brokenLink['language_code'] = $languageCode; + $brokenLink['language_code'] = (string)$languageCode; } return $this; diff --git a/typo3/sysext/redirects/Tests/Functional/Service/SlugServiceTest.php b/typo3/sysext/redirects/Tests/Functional/Service/SlugServiceTest.php index 336df32a3dc4c752999ce65ed38ec658f64c73fe..33ea4eda6e56803f991afb24ba270c25a3bc15bd 100644 --- a/typo3/sysext/redirects/Tests/Functional/Service/SlugServiceTest.php +++ b/typo3/sysext/redirects/Tests/Functional/Service/SlugServiceTest.php @@ -58,7 +58,6 @@ class SlugServiceTest extends FunctionalTestCase 'languageId' => '0', 'base' => '/en/', 'locale' => 'en_US.UTF-8', - 'iso-639-1' => 'en', 'navigationTitle' => 'English', 'hreflang' => 'en-us', 'direction' => 'ltr', @@ -70,7 +69,6 @@ class SlugServiceTest extends FunctionalTestCase 'languageId' => '1', 'base' => 'https://de.example.com/', 'locale' => 'de_DE.UTF-8', - 'iso-639-1' => 'de', 'navigationTitle' => 'German', 'hreflang' => 'de-de', 'direction' => 'ltr', @@ -82,7 +80,6 @@ class SlugServiceTest extends FunctionalTestCase 'languageId' => '2', 'base' => '/es/', 'locale' => 'es_ES.UTF-8', - 'iso-639-1' => 'es', 'navigationTitle' => 'Spanish', 'hreflang' => 'es-es', 'direction' => 'ltr',