src/Twig/Extension/LanguageSwitcherExtension.php line 81

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * Pimcore
  5.  *
  6.  * This source file is available under two different licenses:
  7.  * - GNU General Public License version 3 (GPLv3)
  8.  * - Pimcore Enterprise License (PEL)
  9.  * Full copyright and license information is available in
  10.  * LICENSE.md which is distributed with this source code.
  11.  *
  12.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  13.  *  @license    http://www.pimcore.org/license     GPLv3 and PEL
  14.  */
  15. namespace App\Twig\Extension;
  16. use App\Website\LinkGenerator\AbstractProductLinkGenerator;
  17. use App\Website\LinkGenerator\CategoryLinkGenerator;
  18. use App\Website\LinkGenerator\NewsLinkGenerator;
  19. use App\Website\LinkGenerator\ProductLinkGenerator;
  20. use Pimcore\Model\Document;
  21. use Pimcore\Model\Document\Service;
  22. use Pimcore\Tool;
  23. use Symfony\Component\HttpFoundation\RequestStack;
  24. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  25. use Twig\Extension\AbstractExtension;
  26. use Twig\TwigFunction;
  27. use Pimcore\Model\DataObject;
  28. class LanguageSwitcherExtension extends AbstractExtension
  29. {
  30.     /**
  31.      * @var Service|Service\Dao
  32.      */
  33.     private $documentService;
  34.     private UrlGeneratorInterface $urlGenerator;
  35.     private RequestStack $requestStack;
  36.     private CategoryLinkGenerator $categoryLinkGenerator;
  37.     private NewsLinkGenerator $newsLinkGenerator;
  38.     private ProductLinkGenerator $productLinkGenerator;
  39.     public function __construct(Service $documentServiceUrlGeneratorInterface $urlGeneratorRequestStack $requestStackCategoryLinkGenerator $categoryLinkGeneratorNewsLinkGenerator $newsLinkGeneratorProductLinkGenerator $productLinkGenerator)
  40.     {
  41.         $this->documentService $documentService;
  42.         $this->urlGenerator $urlGenerator;
  43.         $this->requestStack $requestStack;
  44.         $this->categoryLinkGenerator $categoryLinkGenerator;
  45.         $this->newsLinkGenerator $newsLinkGenerator;
  46.         $this->productLinkGenerator $productLinkGenerator;
  47.     }
  48.     public function getLocalizedLinks(Document $document): array
  49.     {
  50.         $dynamicRoutesMapping = [
  51.             'shop-detail' => [
  52.                 'generator' => 'productLinkGenerator',
  53.                 'requiredField' => 'product'
  54.             ],
  55.             'shop-category' => [
  56.                 'generator' => 'categoryLinkGenerator',
  57.                 'requiredField' => 'category'
  58.             ],
  59.             'news-detail' => [
  60.                 'generator' => 'newsLinkGenerator',
  61.                 'requiredField' => 'news'
  62.             ]
  63.         ];
  64.         $translations $this->documentService->getTranslations($document);
  65.         $request $this->requestStack->getCurrentRequest();
  66.         $links = [];
  67.         foreach (Tool::getValidLanguages() as $language) {
  68.             $target '/' $language;
  69.             //skip if root document for local is missing
  70.             if (!(Document::getByPath($target) instanceof Document)) {
  71.                 continue;
  72.             }
  73.             if (isset($translations[$language])) {
  74.                 $localizedDocument Document::getById($translations[$language]);
  75.                 if ($localizedDocument) {
  76.                     $target $localizedDocument->getFullPath();
  77.                 }
  78.             }
  79.             $route $request->get('_route');
  80.             if ($route && array_key_exists($route$dynamicRoutesMapping)) {
  81.                 $routeParams $request->get('_route_params', []);
  82.                 $requiredField $dynamicRoutesMapping[$route]['requiredField'];
  83.                 if (!array_key_exists($requiredField$routeParams)){
  84.                     continue;
  85.                 }
  86.                 $generator $dynamicRoutesMapping[$route]['generator'];
  87.                 $object $request->get($requiredField);
  88.                 if (!is_object($object)) {
  89.                     $object DataObject::getById($object);
  90.                 }
  91.                 
  92.                 $linkGeneratorService $this->$generator;
  93.                 if ($linkGeneratorService instanceof LinkGeneratorInterface) {
  94.                     $target $linkGeneratorService->generate($object, ['locale' => \Locale::getPrimaryLanguage($language)]);
  95.                 }
  96.             }
  97.             $links[$language] = [
  98.                 'link' => $target,
  99.                 'text' => \Locale::getDisplayLanguage($language)
  100.             ];
  101.         }
  102.         return $links;
  103.     }
  104.     /**
  105.      * @param string $language
  106.      * @return string
  107.      */
  108.     public function getLanguageFlag($language)
  109.     {
  110.         $flag '';
  111.         if (Tool::isValidLanguage($language)) {
  112.             $flag self::getLanguageFlagFile($language);
  113.         }
  114.         $flag preg_replace('@^' preg_quote(PIMCORE_WEB_ROOT'@') . '@'''$flag);
  115.         return $flag;
  116.     }
  117.     /**
  118.      * @inheritDoc
  119.      */
  120.     public function getFunctions(): array
  121.     {
  122.         return [
  123.             new TwigFunction('get_localized_links', [$this'getLocalizedLinks']),
  124.             new TwigFunction('get_language_flag', [$this'getLanguageFlag'])
  125.         ];
  126.     }
  127.     /**
  128.      * @param string $language
  129.      *
  130.      * @return string
  131.      */
  132.     public static function getLanguageFlagFile($language)
  133.     {
  134.         $basePath '/bundles/pimcoreadmin/img/flags';
  135.         $code strtolower($language);
  136.         $iconPath $basePath '/countries/_unknown.svg';
  137.         $languageCountryMapping = [
  138.             'aa' => 'er''af' => 'za''am' => 'et''as' => 'in''ast' => 'es''asa' => 'tz',
  139.             'az' => 'az''bas' => 'cm''eu' => 'es''be' => 'by''bem' => 'zm''bez' => 'tz''bg' => 'bg',
  140.             'bm' => 'ml''bn' => 'bd''br' => 'fr''brx' => 'in''bs' => 'ba''cs' => 'cz''da' => 'dk',
  141.             'de' => 'de''dz' => 'bt''el' => 'gr''en' => 'gb''es' => 'es''et' => 'ee''fi' => 'fi',
  142.             'fo' => 'fo''fr' => 'fr''ga' => 'ie''gv' => 'im''he' => 'il''hi' => 'in''hr' => 'hr',
  143.             'hu' => 'hu''hy' => 'am''id' => 'id''ig' => 'ng''is' => 'is''it' => 'it''ja' => 'jp',
  144.             'ka' => 'ge''os' => 'ge''kea' => 'cv''kk' => 'kz''kl' => 'gl''km' => 'kh''ko' => 'kr',
  145.             'lg' => 'ug''lo' => 'la''lt' => 'lt''mg' => 'mg''mk' => 'mk''mn' => 'mn''ms' => 'my',
  146.             'mt' => 'mt''my' => 'mm''nb' => 'no''ne' => 'np''nl' => 'nl''nn' => 'no''pl' => 'pl',
  147.             'pt' => 'pt''ro' => 'ro''ru' => 'ru''sg' => 'cf''sk' => 'sk''sl' => 'si''sq' => 'al',
  148.             'sr' => 'rs''sv' => 'se''swc' => 'cd''th' => 'th''to' => 'to''tr' => 'tr''tzm' => 'ma',
  149.             'uk' => 'ua''uz' => 'uz''vi' => 'vn''zh' => 'cn''gd' => 'gb-sct''gd-gb' => 'gb-sct',
  150.             'cy' => 'gb-wls''cy-gb' => 'gb-wls''fy' => 'nl''xh' => 'za''yo' => 'bj''zu' => 'za',
  151.             'ta' => 'lk''te' => 'in''ss' => 'za''sw' => 'ke''so' => 'so''si' => 'lk''ii' => 'cn',
  152.             'zh-hans' => 'cn''sn' => 'zw''rm' => 'ch''pa' => 'in''fa' => 'ir''lv' => 'lv''gl' => 'es',
  153.             'fil' => 'ph',
  154.         ];
  155.         if (array_key_exists($code$languageCountryMapping)) {
  156.             $iconPath $basePath '/countries/' $languageCountryMapping[$code] . '.svg';
  157.         }
  158.         return $iconPath;
  159.     }
  160. }