From dccd3fea6eebb5fce1cf83aa922fd77f05bd8593 Mon Sep 17 00:00:00 2001 From: Karsten Nowak Date: Fri, 15 May 2026 08:34:39 +0200 Subject: [PATCH 01/13] [TASK] Add `checkIntegrityXliff` to runTests Resolves: #1871 --- Build/Scripts/checkIntegrityXliff.php | 314 ++++++++++++++++++++++++++ Build/Scripts/runTests.sh | 4 + 2 files changed, 318 insertions(+) create mode 100644 Build/Scripts/checkIntegrityXliff.php diff --git a/Build/Scripts/checkIntegrityXliff.php b/Build/Scripts/checkIntegrityXliff.php new file mode 100644 index 000000000..89046882b --- /dev/null +++ b/Build/Scripts/checkIntegrityXliff.php @@ -0,0 +1,314 @@ +#!/usr/bin/env php +findXliff(); + $output = new ConsoleOutput(); + $output->setFormatter(new OutputFormatter(true)); + + $testResults = []; + $errors = []; + + /** @var \SplFileInfo $labelFile */ + foreach ($filesToProcess as $labelFile) { + $fullFilePath = $labelFile->getRealPath(); + $result = $this->checkValidLabels($fullFilePath); + if (isset($result['error'])) { + $errors['EXT:' . $result['extensionKey'] . ':' . $result['shortLabelFile']] = $result['error']; + } + $testResults[] = $result; + } + + if ($testResults === []) { + return 1; + } + + // Only show full table output if verbose is on + if ($isVerbose) { + $table = new Table($output); + $table->setHeaders(['EXT', 'File', 'Status', 'Errorcode']); + foreach ($testResults as $result) { + $table->addRow([ + $result['extensionKey'], + $result['shortLabelFile'], + (!isset($result['error']) ? "\xF0\x9F\x91\x8C" : "\xF0\x9F\x92\x80"), + $result['errorcode'] ?? '', + ]); + } + $table->setFooterTitle(count($testResults) . ' files, ' . count($errors) . ' Errors'); + $table->render(); + } else { + // Non-verbose: just show a summary line + if ($errors !== []) { + $output->writeln('' . count($errors) . ' error(s) found in ' . count($testResults) . ' files.'); + } + } + + if ($errors === []) { + return 0; + } + + // Only show detailed error table if verbose + if ($isVerbose) { + $output->writeln(''); + $table = new Table($output); + $table->setHeaders(['File', 'Error']); + foreach ($errors as $file => $errorMessage) { + $table->addRow([$file, $errorMessage]); + $table->addRow([new TableSeparator(), new TableSeparator()]); + } + $table->setColumnMaxWidth(0, 40); + $table->setColumnMaxWidth(1, 80); + $table->render(); + } else { + // Compact error summary + foreach ($errors as $file => $message) { + $output->writeln("$file: $message"); + } + } + + return 1; + } + + private function findXliff(): Finder + { + $finder = new Finder(); + return $finder + ->files() + ->in(__DIR__ . '/../../typo3/sysext/*/Resources/Private/Language/') + ->name('*.xlf'); + } + + private function checkValidLabels(string $labelFile): array + { + $extensionKey = 'N/A'; + $shortLabelFile = basename($labelFile); + if (preg_match('@sysext/(.+)/Resources/Private/Language/(.+)$@imsU', $labelFile, $matches)) { + $extensionKey = $matches[1]; + $shortLabelFile = $matches[2]; + } + + $result = [ + 'shortLabelFile' => $shortLabelFile, + 'extensionKey' => $extensionKey, + ]; + + $xml = simplexml_load_file($labelFile); + if ($xml === false) { + $result['error'] = 'XML not parsable'; + $result['errorcode'] = 'XML'; + return $result; + } + + $attributes = (array)$xml->attributes(); + $version = $attributes['@attributes']['version'] ?? ''; + $supportedVersions = ['1.2', '2.0']; + if (!in_array($version, $supportedVersions, true)) { + $result['error'] = 'Incompatible version: ' . $version . ' (expected: ' . implode(', ', $supportedVersions) . ')'; + $result['errorcode'] = 'XLF version'; + return $result; + } + + $dom = XmlUtils::loadFile($labelFile, null); + $errors = XliffUtils::validateSchema($dom); + if ($errors) { + $result['error'] = sprintf('File %s has errors: ', $labelFile); + foreach ($errors as $error) { + $result['error'] .= ($error['message'] ?? '') . ' '; + } + $result['errorcode'] = 'XLF linting'; + return $result; + } + + $fileAttributes = (array)$xml->file->attributes(); + if ($version === '1.2') { + $namespaces = $xml->getNamespaces(true); + if (isset($namespaces[''])) { + // Normalize empty namespace to "xml" + $namespaces['xml'] = $namespaces['']; + unset($namespaces['']); + } + $ns = 'urn:oasis:names:tc:xliff:document:1.2'; + if ($namespaces !== ['xml' => $ns]) { + $result['error'] = 'Invalid XLIFF namespace: ' . json_encode($namespaces) . ' (expected: ' . $ns . ')'; + $result['errorcode'] = 'XML-NS'; + return $result; + } + $xml->registerXPathNamespace('x', $ns); + + $sourceLanguage = $fileAttributes['@attributes']['source-language'] ?? ''; + $datatype = $fileAttributes['@attributes']['datatype'] ?? ''; + $original = $fileAttributes['@attributes']['original'] ?? ''; + $date = $fileAttributes['@attributes']['date'] ?? ''; + + $isIso = ($extensionKey === 'core' && str_starts_with($shortLabelFile, 'Iso/')); + + if ($sourceLanguage !== 'en') { + $result['error'] = 'Invalid source-language: ' . $sourceLanguage; + $result['errorcode'] = 'file.source-language'; + return $result; + } + + if ($datatype !== 'plaintext') { + $result['error'] = 'Invalid datatype: ' . $datatype; + $result['errorcode'] = 'file.datatype'; + return $result; + } + + $expectedOriginals = [ + 'EXT:' . $extensionKey . '/Resources/Private/Language/' . $shortLabelFile, + 'messages', // @todo is this right? + ]; + + if ($isIso) { + $expectedOriginals[] = 'EXT:core/Resources/Private/Language/countries.xlf'; + } + if (!in_array($original, $expectedOriginals, true)) { + $result['error'] = 'Invalid original: ' . $original . ' (expected: ' . implode(', ', $expectedOriginals) . ')'; + $result['errorcode'] = 'file.original'; + return $result; + } + + if (!$isIso && (strtotime($date) === false || strtotime($date) === 0)) { + $result['error'] = 'Invalid date: ' . $date; + $result['errorcode'] = 'file.date'; + return $result; + } + + // verify these are deprecated: + $transUnits = $xml->xpath('/x:xliff/x:file/x:body/x:trans-unit'); + $seenKeys = []; + foreach ($transUnits as $unit) { + $unitAttributes = (array)$unit; + $unitId = $unitAttributes['@attributes']['id'] ?? ''; + if ($unitId === '') { + $result['error'] = 'TransUnit without ID specified.'; + $result['errorcode'] = 'trans-unit'; + return $result; + } + if (isset($seenKeys[$unitId])) { + $result['error'] = 'Duplicate trans-unit id: ' . $unitId; + $result['errorcode'] = 'trans-unit.duplicate-id'; + return $result; + } + + if (in_array($unitId, self::expectedXliffDeprecations, true) + && ($unitAttributes['@attributes'][self::XliffDeprecationKey] ?? '') === '' + ) { + $result['error'] = 'TransUnit ' . $unitId . ' missing ' . self::XliffDeprecationKey . ' attribute.'; + $result['errorcode'] = 'trans-unit.' . self::XliffDeprecationKey; + return $result; + } + $seenKeys[$unitId] = $unitId; + } + + if (preg_match(self::xliffModuleRegularExpression, $labelFile)) { + // Hit on any "backend module file". + foreach (self::xliffModuleRequiredKeys as $requiredKey) { + if (!isset($seenKeys[$requiredKey])) { + $result['error'] = 'Backend module missing label ' . $requiredKey . '.'; + $result['errorcode'] = 'missing ' . $requiredKey; + return $result; + } + } + } + } else { + $fileId = $fileAttributes['@attributes']['id'] ?? ''; + if ($fileId === '') { + $result['error'] = 'Missing file.id'; + $result['errorcode'] = 'file.id'; + return $result; + } + + $ns = 'urn:oasis:names:tc:xliff:document:2.0'; + $xml->registerXPathNamespace('x', $ns); + + // In XLIFF 2.0, translatable content is in + $units = $xml->xpath('/x:xliff/x:file/x:unit'); + $seenUnitIds = []; + + foreach ($units as $unit) { + $attrs = $unit->attributes(); + $unitId = isset($attrs['id']) ? (string)$attrs['id'] : ''; + + if ($unitId === '') { + $result['error'] = 'Unit without ID specified.'; + $result['errorcode'] = 'unit'; + return $result; + } + + if (isset($seenUnitIds[$unitId])) { + $result['error'] = 'Duplicate unit id: ' . $unitId; + $result['errorcode'] = 'unit.duplicate-id'; + return $result; + } + + $seenUnitIds[$unitId] = true; + } + + // XLIFF 2.0 has no deprecation syntax check yet. + } + + // Currently, "locallang.xlf" and "messages.xlf" inside + // the same directory are not working, as only one gets parsed. + $labelFileName = basename($labelFile); + $labelDirName = dirname($labelFile); + if ($labelFileName === 'messages.xlf') { + if (file_exists($labelDirName . '/locallang.xlf') && file_exists($labelDirName . '/messages.xlf')) { + $result['error'] = 'Cannot have message.xlf AND locallang.xlf files in ' . $labelDirName; + $result['errorcode'] = 'file.locallang+messages'; + return $result; + } + } + + return $result; + } +} + +exit((new CheckIntegrityXliff())->execute($argv)); diff --git a/Build/Scripts/runTests.sh b/Build/Scripts/runTests.sh index fef616ea7..c9a053893 100755 --- a/Build/Scripts/runTests.sh +++ b/Build/Scripts/runTests.sh @@ -610,6 +610,10 @@ case ${TEST_SUITE} in ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name composer-normalize-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}" SUITE_EXIT_CODE=$? ;; + checkIntegrityXliff) + ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name check-integrity-set-labels-${SUFFIX} ${IMAGE_PHP} php -dxdebug.mode=off Build/Scripts/checkIntegrityXliff.php + SUITE_EXIT_CODE=$? + ;; clean) cleanCacheFiles cleanRenderedDocumentationFiles From bb2b8d7be15c4e3de0caef086e2fd9cee9bd8e30 Mon Sep 17 00:00:00 2001 From: Karsten Nowak Date: Mon, 1 Jun 2026 11:52:33 +0200 Subject: [PATCH 02/13] [BUGFIX] Adjust paths to run xliff linting in the tea extension Resolves: #1871 --- Build/Scripts/checkIntegrityXliff.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Build/Scripts/checkIntegrityXliff.php b/Build/Scripts/checkIntegrityXliff.php index 89046882b..8d984ecf3 100644 --- a/Build/Scripts/checkIntegrityXliff.php +++ b/Build/Scripts/checkIntegrityXliff.php @@ -24,7 +24,7 @@ use Symfony\Component\Finder\Finder; use Symfony\Component\Translation\Util\XliffUtils; -require __DIR__ . '/../../vendor/autoload.php'; +require __DIR__ . '/../../.Build/vendor/autoload.php'; if (PHP_SAPI !== 'cli') { die('Script must be called from command line.' . chr(10)); @@ -121,7 +121,7 @@ private function findXliff(): Finder $finder = new Finder(); return $finder ->files() - ->in(__DIR__ . '/../../typo3/sysext/*/Resources/Private/Language/') + ->in(__DIR__ . '/../../Resources/Private/Language/') ->name('*.xlf'); } @@ -129,7 +129,7 @@ private function checkValidLabels(string $labelFile): array { $extensionKey = 'N/A'; $shortLabelFile = basename($labelFile); - if (preg_match('@sysext/(.+)/Resources/Private/Language/(.+)$@imsU', $labelFile, $matches)) { + if (preg_match('@/([a-z][a-z0-9_]*)/Resources/Private/Language/(.+)$@imsU', $labelFile, $matches)) { $extensionKey = $matches[1]; $shortLabelFile = $matches[2]; } From 032af7a0f6376ec147df53327bf12c664b50c96f Mon Sep 17 00:00:00 2001 From: Karsten Nowak Date: Mon, 1 Jun 2026 14:27:40 +0200 Subject: [PATCH 03/13] [TASK] Adjust `runTests.sh` after merge lintXliff to bash function https://github.com/TYPO3BestPractices/tea/pull/2154 Related: #1871 --- Build/Scripts/runTests.sh | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Build/Scripts/runTests.sh b/Build/Scripts/runTests.sh index c9a053893..b65e85bfe 100755 --- a/Build/Scripts/runTests.sh +++ b/Build/Scripts/runTests.sh @@ -185,6 +185,7 @@ Options: Specifies which script/tool to run - cgl: Fixes the code style with the PHP Coding Standards Fixer (PHP-CS-Fixer). Set -n for dry-run. - checkComposerNormalize: Checks the order of the composer.json entries. + - checkIntegrityXliff: checks for all xlf files for validity and deprecated usages - clean: clean up build, cache and testing related files and folders - cleanCache: clean up cache related files and folders - cleanRenderedDocumentation: clean up rendered documentation files and folders (Documentation-GENERATED-temp) @@ -203,7 +204,6 @@ Options: - lintJson: JSON linting - lintPhp: PHP linting - lintTypoScript: TypoScript linting - - lintXliff: XLIFF linting - lintYaml: YAML linting - npm: "npm" with all remaining arguments dispatched. - phpCsFixer fixes code to follow the standards. Set -n for dry-run. @@ -728,10 +728,6 @@ case ${TEST_SUITE} in lintTypoScript SUITE_EXIT_CODE=$? ;; - lintXliff) - lintXliff - SUITE_EXIT_CODE=$? - ;; lintYaml) lintYaml SUITE_EXIT_CODE=$? From 36c733c49b84d1a426229edbbb6b11a133bd2cca Mon Sep 17 00:00:00 2001 From: Karsten Nowak Date: Mon, 1 Jun 2026 15:26:47 +0200 Subject: [PATCH 04/13] [TASK] Remove readonly from `checkIntegrityXliff` class We support also PHP 8.1 and there is no readonly. Related: #1871 --- Build/Scripts/checkIntegrityXliff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Build/Scripts/checkIntegrityXliff.php b/Build/Scripts/checkIntegrityXliff.php index 8d984ecf3..d0291082f 100644 --- a/Build/Scripts/checkIntegrityXliff.php +++ b/Build/Scripts/checkIntegrityXliff.php @@ -30,7 +30,7 @@ die('Script must be called from command line.' . chr(10)); } -final readonly class CheckIntegrityXliff +final class CheckIntegrityXliff { private const expectedXliffDeprecations = [ 'mlang_labels_tablabel', From 6c92a6ff1e165a1dbe21f51fd3405d1dcd914f73 Mon Sep 17 00:00:00 2001 From: Karsten Nowak Date: Mon, 1 Jun 2026 15:28:06 +0200 Subject: [PATCH 05/13] [TASK] Change command for composer script `check:xliff:lint` Resolves: #1871 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 0d8980651..650fd69b2 100644 --- a/composer.json +++ b/composer.json @@ -160,7 +160,7 @@ "check:tests:create-directories": "mkdir -p .Build/public/typo3temp/var/tests", "check:tests:unit": "phpunit -c Build/phpunit/UnitTests.xml", "check:typoscript:lint": "typoscript-lint -c Build/typoscript-lint/config.yml --ansi -n --fail-on-warnings -vvv Configuration/TypoScript Tests/Functional/Controller/Fixtures/TypoScript", - "check:xliff:lint": "php Build/Scripts/xliffLint.sh lint:xliff Resources/Private/Language", + "check:xliff:lint": "php Build/Scripts/checkIntegrityXliff.php", "check:yaml:lint": "find . ! -path '*.Build/*' ! -path '*node_modules/*' \\( -name '*.yaml' -o -name '*.yml' \\) | xargs -r php ./.Build/bin/yaml-lint", "coverage:create-directories": "mkdir -p build/coverage build/logs", "fix": [ From 91edb2d6bda34ca129f2d5eba36e3117d936444d Mon Sep 17 00:00:00 2001 From: Karsten Nowak Date: Mon, 1 Jun 2026 15:47:16 +0200 Subject: [PATCH 06/13] [TASK] Add constant for path to xliff files Related: #1871 --- Build/Scripts/checkIntegrityXliff.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Build/Scripts/checkIntegrityXliff.php b/Build/Scripts/checkIntegrityXliff.php index d0291082f..b11ce8747 100644 --- a/Build/Scripts/checkIntegrityXliff.php +++ b/Build/Scripts/checkIntegrityXliff.php @@ -44,6 +44,7 @@ final class CheckIntegrityXliff 'short_description', ]; private const XliffDeprecationKey = 'x-unused-since'; + private const pathToXliffFiles = 'Resources/Private/Language'; public function execute(array $argv = []): int { $isVerbose = in_array('-v', $argv, true) || in_array('--verbose', $argv, true); @@ -121,7 +122,7 @@ private function findXliff(): Finder $finder = new Finder(); return $finder ->files() - ->in(__DIR__ . '/../../Resources/Private/Language/') + ->in(__DIR__ . '/../../' . self::pathToXliffFiles . '/') ->name('*.xlf'); } @@ -129,7 +130,7 @@ private function checkValidLabels(string $labelFile): array { $extensionKey = 'N/A'; $shortLabelFile = basename($labelFile); - if (preg_match('@/([a-z][a-z0-9_]*)/Resources/Private/Language/(.+)$@imsU', $labelFile, $matches)) { + if (preg_match('@/([a-z][a-z0-9_]*)/' . self::pathToXliffFiles . '/(.+)$@imsU', $labelFile, $matches)) { $extensionKey = $matches[1]; $shortLabelFile = $matches[2]; } @@ -202,7 +203,7 @@ private function checkValidLabels(string $labelFile): array } $expectedOriginals = [ - 'EXT:' . $extensionKey . '/Resources/Private/Language/' . $shortLabelFile, + 'EXT:' . $extensionKey . '/' . self::pathToXliffFiles . '/' . $shortLabelFile, 'messages', // @todo is this right? ]; From 3cc4e6616839f4002833ac222f82187b30204fe4 Mon Sep 17 00:00:00 2001 From: Karsten Nowak Date: Mon, 1 Jun 2026 15:58:31 +0200 Subject: [PATCH 07/13] [TASK] Add dev dependencies for `checkIntegrityXliff` Related: #1871 --- composer.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 650fd69b2..c464f6ec7 100644 --- a/composer.json +++ b/composer.json @@ -45,7 +45,8 @@ "typo3/cms-extbase": "^12.4.41 || ^13.4", "typo3/cms-fluid": "^12.4.41 || ^13.4", "typo3/cms-frontend": "^12.4.41 || ^13.4", - "typo3/cms-install": "^12.4.41 || ^13.4" + "typo3/cms-install": "^12.4.41 || ^13.4", + "typo3/minimal": "^13.4" }, "require-dev": { "ergebnis/composer-normalize": "2.52.0", @@ -66,7 +67,9 @@ "spaze/phpstan-disallowed-calls": "4.12.0", "ssch/typo3-rector": "2.15.2 || 3.14.1", "ssch/typo3-rector-testing-framework": "2.0.1 || 3.0.0", + "symfony/config": "^6.4 || ^7.4 || ^8.1", "symfony/console": "^6.4 || ^7.4", + "symfony/finder": "^6.4 || ^7.4 || ^8.1", "symfony/translation": "^6.4 || ^7.4", "symfony/yaml": "^6.4 || ^7.4", "tomasvotruba/cognitive-complexity": "0.2.3 || 1.1.1", From 0294546b083e01ea43e9059f5a04716456da92df Mon Sep 17 00:00:00 2001 From: Karsten Nowak Date: Mon, 1 Jun 2026 16:01:49 +0200 Subject: [PATCH 08/13] [TASK] Use IDE auto format on `checkIntegrityXliff.php` --- Build/Scripts/checkIntegrityXliff.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Build/Scripts/checkIntegrityXliff.php b/Build/Scripts/checkIntegrityXliff.php index b11ce8747..a1b6dcbb5 100644 --- a/Build/Scripts/checkIntegrityXliff.php +++ b/Build/Scripts/checkIntegrityXliff.php @@ -45,6 +45,7 @@ final class CheckIntegrityXliff ]; private const XliffDeprecationKey = 'x-unused-since'; private const pathToXliffFiles = 'Resources/Private/Language'; + public function execute(array $argv = []): int { $isVerbose = in_array('-v', $argv, true) || in_array('--verbose', $argv, true); @@ -151,7 +152,8 @@ private function checkValidLabels(string $labelFile): array $version = $attributes['@attributes']['version'] ?? ''; $supportedVersions = ['1.2', '2.0']; if (!in_array($version, $supportedVersions, true)) { - $result['error'] = 'Incompatible version: ' . $version . ' (expected: ' . implode(', ', $supportedVersions) . ')'; + $result['error'] = 'Incompatible version: ' . $version . ' (expected: ' . implode(', ', + $supportedVersions) . ')'; $result['errorcode'] = 'XLF version'; return $result; } @@ -211,7 +213,8 @@ private function checkValidLabels(string $labelFile): array $expectedOriginals[] = 'EXT:core/Resources/Private/Language/countries.xlf'; } if (!in_array($original, $expectedOriginals, true)) { - $result['error'] = 'Invalid original: ' . $original . ' (expected: ' . implode(', ', $expectedOriginals) . ')'; + $result['error'] = 'Invalid original: ' . $original . ' (expected: ' . implode(', ', + $expectedOriginals) . ')'; $result['errorcode'] = 'file.original'; return $result; } From 3f817571bf23a453fcf1eee18391e69da773a9e9 Mon Sep 17 00:00:00 2001 From: Karsten Nowak Date: Mon, 1 Jun 2026 16:37:55 +0200 Subject: [PATCH 09/13] [TASK] Remove `lintXliff` again Related: #1871 --- Build/Scripts/runTests.sh | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Build/Scripts/runTests.sh b/Build/Scripts/runTests.sh index b65e85bfe..37029038c 100755 --- a/Build/Scripts/runTests.sh +++ b/Build/Scripts/runTests.sh @@ -375,11 +375,6 @@ lintTypoScript() { ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name lintTypoScript-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}" } -lintXliff() { - COMMAND="php Build/Scripts/xliffLint.sh lint:xliff Resources/Private/Language" - ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name lintXliff-${SUFFIX} ${IMAGE_PHP} ${COMMAND} -} - lintYaml() { COMMAND="composer check:yaml:lint" ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name lintYaml-${SUFFIX} -e COMPOSER_CACHE_DIR=.cache/composer -e COMPOSER_ROOT_VERSION=${COMPOSER_ROOT_VERSION} ${IMAGE_PHP} /bin/sh -c "${COMMAND}" From 462d9d90234e0955e9a5c26d793b6821714108f4 Mon Sep 17 00:00:00 2001 From: Karsten Nowak Date: Mon, 1 Jun 2026 16:39:31 +0200 Subject: [PATCH 10/13] [TASK] Remove `xliffLint.sh` file Related: #1871 --- Build/Scripts/xliffLint.sh | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 Build/Scripts/xliffLint.sh diff --git a/Build/Scripts/xliffLint.sh b/Build/Scripts/xliffLint.sh deleted file mode 100644 index 08b74be0c..000000000 --- a/Build/Scripts/xliffLint.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env php -add(new XliffLintCommand(null, null, null, false)); -$application->add(new LintCommand()); - -exit($application->run()); From bf4c8092353994d6d99232b99d570edb62e7622b Mon Sep 17 00:00:00 2001 From: Karsten Nowak Date: Thu, 4 Jun 2026 17:22:01 +0200 Subject: [PATCH 11/13] [TASK] Remove shebang and class annotation from core Related: #1871 --- Build/Scripts/checkIntegrityXliff.php | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/Build/Scripts/checkIntegrityXliff.php b/Build/Scripts/checkIntegrityXliff.php index a1b6dcbb5..01232d5ec 100644 --- a/Build/Scripts/checkIntegrityXliff.php +++ b/Build/Scripts/checkIntegrityXliff.php @@ -1,21 +1,7 @@ -#!/usr/bin/env php Date: Thu, 4 Jun 2026 17:23:40 +0200 Subject: [PATCH 12/13] [TASK] Adjust dependencies in `composer.json` file Related: #1871 --- composer.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index c464f6ec7..49c78df1c 100644 --- a/composer.json +++ b/composer.json @@ -45,8 +45,7 @@ "typo3/cms-extbase": "^12.4.41 || ^13.4", "typo3/cms-fluid": "^12.4.41 || ^13.4", "typo3/cms-frontend": "^12.4.41 || ^13.4", - "typo3/cms-install": "^12.4.41 || ^13.4", - "typo3/minimal": "^13.4" + "typo3/cms-install": "^12.4.41 || ^13.4" }, "require-dev": { "ergebnis/composer-normalize": "2.52.0", @@ -67,9 +66,9 @@ "spaze/phpstan-disallowed-calls": "4.12.0", "ssch/typo3-rector": "2.15.2 || 3.14.1", "ssch/typo3-rector-testing-framework": "2.0.1 || 3.0.0", - "symfony/config": "^6.4 || ^7.4 || ^8.1", + "symfony/config": "^6.4 || ^7.4", "symfony/console": "^6.4 || ^7.4", - "symfony/finder": "^6.4 || ^7.4 || ^8.1", + "symfony/finder": "^6.4 || ^7.4", "symfony/translation": "^6.4 || ^7.4", "symfony/yaml": "^6.4 || ^7.4", "tomasvotruba/cognitive-complexity": "0.2.3 || 1.1.1", From 7c80962c9225ae44aea558f41324a41a188d42ba Mon Sep 17 00:00:00 2001 From: Karsten Nowak Date: Thu, 4 Jun 2026 17:37:22 +0200 Subject: [PATCH 13/13] [TASK] Replace `$labelFile` annotation Related: #1871 --- Build/Scripts/checkIntegrityXliff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Build/Scripts/checkIntegrityXliff.php b/Build/Scripts/checkIntegrityXliff.php index 01232d5ec..53041d848 100644 --- a/Build/Scripts/checkIntegrityXliff.php +++ b/Build/Scripts/checkIntegrityXliff.php @@ -43,8 +43,8 @@ public function execute(array $argv = []): int $testResults = []; $errors = []; - /** @var \SplFileInfo $labelFile */ foreach ($filesToProcess as $labelFile) { + assert($labelFile instanceof \SplFileInfo); $fullFilePath = $labelFile->getRealPath(); $result = $this->checkValidLabels($fullFilePath); if (isset($result['error'])) {