<?php
namespace App\Service;
use App\Entity\Translation;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class TranslationService extends AbstractController
{
/**
* @var Request|null
*/
private $request;
/**
* @var SessionInterface
*/
private $session;
/**
* TranslationService constructor.
* @param RequestStack $request_stack
* @param SessionInterface $session
*/
public function __construct(RequestStack $request_stack, SessionInterface $session)
{
// init request
$this->request = $request_stack->getCurrentRequest();
$this->session = $session;
}
/**
* @param string $name
* @param string $translation
* @return Translation|object
*/
public function setTranslation(string $name, string $translation)
{
$user = $this->getUser();
if (!$user) {
$userId = 0;
$language = $this->request->getLocale();
} else {
$userId = $user->getId();
$language = $user->getLanguage();
}
$entityManager = $this->getDoctrine()->getManager();
$translationObject = new Translation();
$entityManager->persist($translationObject
->setLanguage($language)
->setName($name)
->setTranslation($translation)
->setCreated(new \DateTime())
->setCreatedBy($userId)
->setModified(new \DateTime())
->setModifiedBy($userId));
$entityManager->flush();
$entityManager->refresh($translationObject);
return $translationObject;
}
/**
* @param string $name
* @return string|null
*/
public function getTranslation(string $name): ?string
{
$entityManager = $this->getDoctrine()->getManager();
$language = $this->determineLanguage();
$translations = $entityManager->getRepository(Translation::class)->findBy([
"name" => $name,
"language" => $language,
], [
"id" => "DESC"
], 1);
// if we have no translation fall back to default language EN
if (!count($translations)) {
$translations = $entityManager->getRepository(Translation::class)->findBy([
"name" => $name,
"language" => "en",
], [
"id" => "DESC"
], 1);
}
// if there is even no EN translation just return the name
if (!count($translations)) {
return $name;
}
return htmlspecialchars($translations[0]->getTranslation());
}
/**
* @return mixed|string
*/
private function determineLanguage()
{
// try to load from session first
if ($this->session->get("_locale", false)) {
return $this->session->get("_locale");
}
// try to load from user second
if ($this->getUser()) {
return $this->getUser()->getLanguage();
}
// try to load from cookie
if (isset($_COOKIE["language"])) {
return $_COOKIE["language"];
}
// else use locale
return $this->request->getLocale();
}
}