src/EventSubscriber/RuntimeHtmlTranslationSubscriber.php line 25

  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Service\RuntimeHtmlTranslationService;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  7. use Symfony\Component\HttpKernel\KernelEvents;
  8. final class RuntimeHtmlTranslationSubscriber implements EventSubscriberInterface
  9. {
  10.     public function __construct(
  11.         private readonly RuntimeHtmlTranslationService $runtimeHtmlTranslationService,
  12.     ) {
  13.     }
  14.     public static function getSubscribedEvents(): array
  15.     {
  16.         return [
  17.             KernelEvents::RESPONSE => ['onKernelResponse', -32],
  18.         ];
  19.     }
  20.     public function onKernelResponse(ResponseEvent $event): void
  21.     {
  22.         if (!$event->isMainRequest()) {
  23.             return;
  24.         }
  25.         $request $event->getRequest();
  26.         $locale strtolower(substr((string) $request->getLocale(), 02));
  27.         if ($locale !== 'en') {
  28.             return;
  29.         }
  30.         $path = (string) $request->getPathInfo();
  31.         if (str_starts_with($path'/_profiler') || str_starts_with($path'/_wdt')) {
  32.             return;
  33.         }
  34.         $response $event->getResponse();
  35.         if (!$response instanceof Response || $response->isRedirection()) {
  36.             return;
  37.         }
  38.         $contentType strtolower((string) $response->headers->get('Content-Type'''));
  39.         if ($contentType !== '' && !str_contains($contentType'text/html')) {
  40.             return;
  41.         }
  42.         $content $response->getContent();
  43.         if (!is_string($content) || $content === '') {
  44.             return;
  45.         }
  46.         $translated $this->runtimeHtmlTranslationService->translateHtml($content$locale);
  47.         if ($translated !== $content) {
  48.             $response->setContent($translated);
  49.         }
  50.     }
  51. }