<?php
namespace App\Timeline\EventSubscriber;
use App\Core\Service\GoogleTranslateClient;
use App\Timeline\Event\TimelinePostEvents;
use App\Timeline\Event\TimelinePostPublishedEvent;
use Pimcore\Event\DataObjectEvents;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Model\DataObject\TimelinePost;
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class TimelinePostTranslationSubscriber implements EventSubscriberInterface
{
public function __construct(
protected GoogleTranslateClient $googleTranslateClient,
protected ContainerBagInterface $params
) {
}
public static function getSubscribedEvents()
{
return [
DataObjectEvents::PRE_UPDATE => 'onPreUpdate',
TimelinePostEvents::PUBLISHED => 'postPublished',
];
}
public function onPreUpdate(DataObjectEvent $event)
{
$object = $event->getObject();
$className = (new \ReflectionClass($object))->getShortName();
if (!in_array($className, ['TimelinePost'])) {
return;
}
if (!$object instanceof TimelinePost) {
throw new \Exception('Field is not a TimelinePost', 1);
}
if (!$event->hasArgument('saveVersionOnly') && !$object->getDetectedLanguage()) {
$this->updateTextLocale($object);
}
}
public function postPublished(TimelinePostPublishedEvent $event)
{
if ($event->post->getDetectedLanguage()) {
$post = $this->updateTextLocale($event->post);
$post->save();
}
}
protected function updateTextLocale($post)
{
try {
$content = $post->getText();
if (mb_strlen($content) > 0 && $this->params->get('kernel.environment') != 'dev' && $language = $this->googleTranslateClient->detectLanguage($content)) {
$post->setDetectedLanguage($language);
}
} catch(\Exception $e) {}
return $post;
}
}