86 lines
2.3 KiB
PHP
86 lines
2.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Esun\Translation\Model\StoreView;
|
|
|
|
use Magento\Store\Model\StoreManagerInterface;
|
|
|
|
class LanguageGroupProvider
|
|
{
|
|
public function __construct(
|
|
private readonly StoreManagerInterface $storeManager
|
|
) {
|
|
}
|
|
|
|
/**
|
|
* @return LanguageGroup[]
|
|
*/
|
|
public function getGroups(): array
|
|
{
|
|
$groups = [];
|
|
foreach ($this->storeManager->getStores(false) as $store) {
|
|
if (!$store->isActive()) {
|
|
continue;
|
|
}
|
|
|
|
$languageCode = $this->getLanguageCode((string)$store->getCode());
|
|
if ($languageCode === '') {
|
|
continue;
|
|
}
|
|
|
|
$groups[$languageCode]['label'] = $this->getLanguageLabel($languageCode);
|
|
$groups[$languageCode]['store_ids'][] = (int)$store->getId();
|
|
$groups[$languageCode]['store_codes'][] = (string)$store->getCode();
|
|
}
|
|
|
|
ksort($groups);
|
|
|
|
return array_map(
|
|
static fn (array $group): LanguageGroup => new LanguageGroup(
|
|
$group['label'],
|
|
$group['target_locale'],
|
|
$group['store_ids'],
|
|
$group['store_codes']
|
|
),
|
|
array_map(
|
|
static fn (array $group, string $languageCode): array => $group + ['target_locale' => $languageCode],
|
|
$groups,
|
|
array_keys($groups)
|
|
)
|
|
);
|
|
}
|
|
|
|
public function getGroup(string $label): ?LanguageGroup
|
|
{
|
|
foreach ($this->getGroups() as $group) {
|
|
if ($group->getLabel() === $label || $group->getTargetLocale() === $label) {
|
|
return $group;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private function getLanguageCode(string $storeCode): string
|
|
{
|
|
if (!preg_match('/^([a-z]{2,3})(?:[_-]|$)/i', $storeCode, $matches)) {
|
|
return '';
|
|
}
|
|
|
|
return strtolower($matches[1]);
|
|
}
|
|
|
|
private function getLanguageLabel(string $languageCode): string
|
|
{
|
|
if (class_exists(\Locale::class)) {
|
|
$label = \Locale::getDisplayLanguage($languageCode, 'en');
|
|
if (is_string($label) && $label !== '') {
|
|
return ucfirst($label);
|
|
}
|
|
}
|
|
|
|
return strtoupper($languageCode);
|
|
}
|
|
}
|