hasGroup('system')) { $activeLanguages = $this->locales->getActiveLanguages(); $locales = []; foreach ($activeLanguages as $language) { $locales[$language] = $this->locales->createLocale($language); } // Collect all label files from all packages first to avoid repeated filesystem scans. $allBaseLocaleResources = []; $packages = $this->packageManager->getActivePackages(); foreach ($packages as $package) { $baseLocaleResources = $this->labelFileResolver->getAllLabelFilesOfPackage($package->getPackageKey(), true)['default'] ?? []; foreach ($baseLocaleResources as $fileReference) { $allBaseLocaleResources[] = $fileReference; } } // Phase 1: Add all resources to Symfony Translator without retrieving catalogues. // This avoids O(n²) behaviour where each getCatalogue() rebuilds from all previously // added resources. By batching all addResource() calls first, catalogue building // only happens once per locale in phase 2. foreach ($locales as $locale) { foreach ($allBaseLocaleResources as $fileReference) { $this->localizationFactory->warmupTranslatorResource($fileReference, $locale); } } // Phase 2: Retrieve catalogues and write to system cache. // Resources are already loaded, so this just builds catalogues once per locale. foreach ($locales as $locale) { foreach ($allBaseLocaleResources as $fileReference) { $this->localizationFactory->getParsedData($fileReference, $locale, true); } } } } }