storeCollectionFactory = $storeCollectionFactory; $this->logger = $logger; $this->scopeConfig = $scopeConfig; } /** * @return string[][] */ public function getStoresByLanguage(): array { $this->load(); return $this->storesByLanguage; } public function getDefaultStoreCodeForLanguage(string $language): ?string { $language = strtolower(trim($language)); $stores = $this->getStoresByLanguage(); return isset($stores[$language][0]) ? $stores[$language][0] : null; } /** @return string[][] */ public function getStoresByLanguageForWebsite(int $websiteId): array { $this->load(); return $this->storesByWebsiteLanguage[$websiteId] ?? []; } public function getStoreCodeForLanguageInWebsite(string $language, int $websiteId): ?string { $language = strtolower(trim($language)); $stores = $this->getStoresByLanguageForWebsite($websiteId); return $stores[$language][0] ?? null; } public function isLanguageInWebsite(string $language, int $websiteId): bool { return $this->getStoreCodeForLanguageInWebsite($language, $websiteId) !== null; } public function isStoreCodeInWebsite(string $storeCode, int $websiteId): bool { $this->load(); return ($this->websiteByStoreCode[trim($storeCode)] ?? null) === $websiteId; } public function getLanguageByStoreCode(string $storeCode): ?string { $this->load(); $storeCode = trim($storeCode); return $this->languageByStoreCode[$storeCode] ?? null; } public function isKnownStoreCode(string $storeCode): bool { return $this->getLanguageByStoreCode($storeCode) !== null; } public function isKnownLanguage(string $language): bool { $language = strtolower(trim($language)); $stores = $this->getStoresByLanguage(); return isset($stores[$language]); } /** * @return string[] */ public function getAllowedLanguages(): array { return array_keys($this->getStoresByLanguage()); } /** * @return string[] */ public function getAllowedStoreCodes(): array { $this->load(); return array_keys($this->languageByStoreCode); } private function load(): void { if ($this->storesByLanguage !== null && $this->languageByStoreCode !== null && $this->storesByWebsiteLanguage !== null && $this->websiteByStoreCode !== null ) { return; } $this->storesByLanguage = []; $this->languageByStoreCode = []; $this->storesByWebsiteLanguage = []; $this->websiteByStoreCode = []; $collection = $this->storeCollectionFactory->create(); $collection->setWithoutDefaultFilter(); $collection->addStatusFilter(1); $collection->setOrder('sort_order', 'ASC'); $collection->setOrder('store_id', 'ASC'); foreach ($collection as $store) { $storeCode = (string)$store->getCode(); $storeId = (int)$store->getId(); if ($storeId === 0) { continue; } $locale = (string)$this->scopeConfig->getValue( 'general/locale/code', ScopeInterface::SCOPE_STORE, $storeCode ); if (!preg_match('/^([a-z]{2,3})(?:[_-][A-Za-z]{4})?(?:[_-][A-Z]{2})?$/', $locale, $matches)) { $this->logger->warning( '[LanguageUrlStoreResolver] Ignored active store view with unsupported locale.', ['store_id' => $storeId, 'store_code' => $storeCode, 'locale' => $locale] ); continue; } $language = strtolower($matches[1]); $websiteId = (int)$store->getWebsiteId(); $this->storesByLanguage[$language][] = $storeCode; $this->languageByStoreCode[$storeCode] = $language; $this->storesByWebsiteLanguage[$websiteId][$language][] = $storeCode; $this->websiteByStoreCode[$storeCode] = $websiteId; } } }