protected function generateAvailableLocalesCollectionByScanningFilesystem()
{
$whitelistPaths = array_keys(array_filter((array) $this->settings['scan']['includePaths']));
if ($whitelistPaths === []) {
return;
}
$blacklistPattern = $this->getScanBlacklistPattern();
/** @var PackageInterface $activePackage */
foreach ($this->packageManager->getActivePackages() as $activePackage) {
$packageResourcesPath = Files::getNormalizedPath($activePackage->getResourcesPath());
if (!is_dir($packageResourcesPath)) {
continue;
}
$directories = [];
foreach ($whitelistPaths as $path) {
$scanPath = Files::concatenatePaths(array($packageResourcesPath, $path));
if (is_dir($scanPath)) {
array_push($directories, Files::getNormalizedPath($scanPath));
}
}
while ($directories !== []) {
$currentDirectory = array_pop($directories);
$relativeDirectory = '/' . str_replace($packageResourcesPath, '', $currentDirectory);
if ($blacklistPattern !== '' && preg_match($blacklistPattern, $relativeDirectory) === 1) {
continue;
}
if ($handle = opendir($currentDirectory)) {
while (false !== ($filename = readdir($handle))) {
if ($filename[0] === '.') {
continue;
}
$pathAndFilename = Files::concatenatePaths([$currentDirectory, $filename]);
if (is_dir($pathAndFilename)) {
array_push($directories, Files::getNormalizedPath($pathAndFilename));
} else {
$localeIdentifier = Utility::extractLocaleTagFromFilename($filename);
if ($localeIdentifier !== false) {
$this->localeCollection->addLocale(new Locale($localeIdentifier));
}
}
}
closedir($handle);
}
}
}
}