src/Service/CustomTranslation/EventListener/SetCustomTranslationListener.php line 54

Open in your IDE?
  1. <?php
  2. namespace Harmonizely\Service\CustomTranslation\EventListener;
  3. use Exception;
  4. use Harmonizely\Repository\Company\Contract\IOrganizationRepository;
  5. use Harmonizely\Repository\Company\Contract\IUserRepository;
  6. use Harmonizely\Service\CustomTranslation\Contract\IGetCustomTranslationCatalogService;
  7. use Harmonizely\Service\CustomTranslation\Event\SetCustomTranslationEvent;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\Translation\MessageCatalogue;
  10. use Symfony\Contracts\Translation\TranslatorInterface;
  11. class SetCustomTranslationListener implements EventSubscriberInterface
  12. {
  13.     /**
  14.      * @var TranslatorInterface
  15.      */
  16.     private TranslatorInterface $translator;
  17.     /**
  18.      * @var IGetCustomTranslationCatalogService
  19.      */
  20.     private IGetCustomTranslationCatalogService $getCustomTranslationCatalogService;
  21.     /**
  22.      * @var array
  23.      */
  24.     private array $messageCatalogueList = [];
  25.     /**
  26.      * @var IUserRepository
  27.      */
  28.     private IUserRepository $userRepository;
  29.     /**
  30.      * @var IOrganizationRepository
  31.      */
  32.     private IOrganizationRepository $organizationRepository;
  33.     /**
  34.      * @param TranslatorInterface $translator
  35.      * @param IGetCustomTranslationCatalogService $getCustomTranslationCatalogService
  36.      * @param IUserRepository $userRepository
  37.      * @param IOrganizationRepository $organizationRepository
  38.      */
  39.     public function __construct(
  40.         TranslatorInterface $translator,
  41.         IGetCustomTranslationCatalogService $getCustomTranslationCatalogService,
  42.         IUserRepository $userRepository,
  43.         IOrganizationRepository $organizationRepository
  44.     )
  45.     {
  46.         $this->translator $translator;
  47.         $this->getCustomTranslationCatalogService $getCustomTranslationCatalogService;
  48.         $this->userRepository $userRepository;
  49.         $this->organizationRepository $organizationRepository;
  50.     }
  51.     /**
  52.      * @return array
  53.      */
  54.     public static function getSubscribedEvents(): array
  55.     {
  56.         return [
  57.             SetCustomTranslationEvent::NAME => 'onSetCustomTranslation',
  58.         ];
  59.     }
  60.     /**
  61.      * @param SetCustomTranslationEvent $event
  62.      * @throws Exception
  63.      */
  64.     public function onSetCustomTranslation(SetCustomTranslationEvent $event): void
  65.     {
  66.         $customTranslationCatalog $this->getCustomTranslationCatalogService->perform(
  67.             $event->getUserId(),
  68.             $event->getOrganizationId()
  69.         );
  70.         if ($event->getUserId()) {
  71.             $user $this->userRepository->find($event->getUserId());
  72.             $accountLocale $user->getLocale();
  73.         } elseif ($event->getOrganizationId()) {
  74.             $organization $this->organizationRepository->find($event->getOrganizationId());
  75.             $accountLocale $organization->getLocale();
  76.         } else {
  77.             $accountLocale $this->translator->getLocale();
  78.         }
  79.         /** @var MessageCatalogue $catalogue */
  80.         $catalogue $this->translator->getCatalogue();
  81.         $autoCatalogue $this->translator->getCatalogue($accountLocale);
  82.         $domains $catalogue->getDomains();
  83.         $this->setDefaultCatalog($catalogue$this->translator->getLocale());
  84.         $this->setDefaultCatalog($autoCatalogue$accountLocale);
  85.         foreach ($customTranslationCatalog->getEntries() as $entry) {
  86.             foreach ($domains as $domain) {
  87.                 $catalogue->set($entry->getMsgId(), $entry->getMsgStr(), $domain);
  88.                 $autoCatalogue->set($entry->getMsgId(), $entry->getMsgStr(), $domain);
  89.             }
  90.         }
  91.     }
  92.     /**
  93.      * @param MessageCatalogue $catalogue
  94.      * @param string $locale
  95.      * @return void
  96.      */
  97.     public function setDefaultCatalog(MessageCatalogue $cataloguestring $locale): void
  98.     {
  99.         if (!isset($this->messageCatalogueList[$locale])) {
  100.             $this->messageCatalogueList[$locale] = new MessageCatalogue($locale$catalogue->all());
  101.         } else {
  102.             $defaultCatalogue $this->messageCatalogueList[$locale];
  103.             foreach ($defaultCatalogue->all() as $domain => $messages) {
  104.                 $catalogue->replace($messages$domain);
  105.             }
  106.         }
  107.     }
  108. }