<?php
namespace App\Controller;
use Exception;
use App\Entity\User;
use App\Entity\Country;
use App\Service\MessageService;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use phpDocumentor\Reflection\DocBlock\Tags\Var_;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class LanguageController extends AbstractController
{
/**
* @Route("/language", name="language")
* @param Request $request
* @param MessageService $messageService
* @return Response
*
* the language locale is set in LocaleSubscriber
* under EventSubscriber. This functions just sets
* language for the user and gives feedback on change.
*
* if user is logged in save language as default language to user
* if not logged in, just give feedback for changed language
*
* @throws Exception
*/
public function language(Request $request, MessageService $messageService)
{
// load language from query for later use
$language = $request->get('language', false);
$baseUrl = $this->generateUrl('home', [], UrlGeneratorInterface::ABSOLUTE_URL);
$source = $request->headers->get('referer', $baseUrl);
// get all countries
$countrys = $this->getDoctrine()->getRepository(Country::class)->findAll();
$countrys = array_map(function($country) {
return $country->getDefaultLanguage();
}, $countrys);
in_array($language, $countrys) ?: $language = 'en';
// if logged in
if ($user_tmp = $this->getUser()) {
// save language to user
$entityManager = $this->getDoctrine()->getManager();
$user = $entityManager->getRepository(User::class)->find($user_tmp->getId());
$user->setLanguage($language);
$entityManager->persist($user);
$entityManager->flush();
// and give feedback
$messageService->setMessage('Language switched to '.strtoupper($language).' successfully.');
$messageService->setMessage('Saved new default language '.strtoupper($language).' on user.');
} else {
// just feedback
$messageService->setMessage('Language switched to '.strtoupper($language).' successfully.');
}
// render view
return $this->redirect(urldecode($source));
}
}