vendor/pimcore/pimcore/bundles/CoreBundle/EventListener/Frontend/LocaleListener.php line 75

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Enterprise License (PEL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  * @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  * @license    http://www.pimcore.org/license     GPLv3 and PEL
  13.  */
  14. namespace Pimcore\Bundle\CoreBundle\EventListener\Frontend;
  15. use Pimcore\Bundle\CoreBundle\EventListener\Traits\PimcoreContextAwareTrait;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
  18. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  19. use Symfony\Component\HttpKernel\KernelEvents;
  20. class LocaleListener implements EventSubscriberInterface
  21. {
  22.     use PimcoreContextAwareTrait;
  23.     protected $lastLocale null;
  24.     /**
  25.      * {@inheritdoc}
  26.      */
  27.     public static function getSubscribedEvents()
  28.     {
  29.         return [
  30.             KernelEvents::REQUEST => ['onKernelRequest'1], // need to be after ElementListener
  31.             KernelEvents::RESPONSE => ['onKernelResponse'], // need to be after ElementListener
  32.         ];
  33.     }
  34.     /**
  35.      * @param GetResponseEvent $event
  36.      */
  37.     public function onKernelRequest(GetResponseEvent $event)
  38.     {
  39.         $request $event->getRequest();
  40.         $locale $request->getLocale();
  41.         if ($locale && $locale != $this->lastLocale) {
  42.             $this->lastLocale $locale;
  43.             // now we prepare everything for setlocale()
  44.             $localeList = [$locale '.utf8'];
  45.             $primaryLanguage = \Locale::getPrimaryLanguage($locale);
  46.             if (\Locale::getRegion($locale)) {
  47.                 // add only the language to the list as a fallback
  48.                 $localeList[] = $primaryLanguage '.utf8';
  49.             } else {
  50.                 // try to get a list of territories for this language
  51.                 // usually OS have no "language only" locale, only the combination language-territory (eg. Debian)
  52.                 $languageRegionMapping = include PIMCORE_PATH '/bundles/CoreBundle/Resources/misc/cldr-language-territory-mapping.php';
  53.                 if (isset($languageRegionMapping[$primaryLanguage])) {
  54.                     foreach ($languageRegionMapping[$primaryLanguage] as $territory) {
  55.                         $localeList[] = $primaryLanguage '_' $territory '.utf8';
  56.                     }
  57.                 }
  58.             }
  59.             setlocale(LC_ALL$localeList);
  60.             setlocale(LC_NUMERIC'C');
  61.         }
  62.     }
  63.     public function onKernelResponse(FilterResponseEvent $event)
  64.     {
  65.         if ($this->lastLocale && $event->isMasterRequest()) {
  66.             $response $event->getResponse();
  67.             $response->headers->set('Content-Language'strtolower(str_replace('_''-'$this->lastLocale)), true);
  68.         }
  69.     }
  70. }