Problem: I want to localize my site based on the domain name.
Symfony strongly suggests that you use paths (like '/en' or '/fr') after the domain name to determine what the locale should be. This is ideal for a site with only one domain name, but for a site that has a different one for each localization, it's unnecessary. You should be able to determine the language based on the domain.
Solution: Use an event listener.
With an event listener, you can catch the request, parse the domain name, and set the locale appropriately. For this blog's purposes, let's say that a site has www.endomain.com for its English site and www.frdomain for its French site.
Create this folder/file in your bundle: EventListener/LocaleListener.php. Inside, put this:
namespace My\CustomBundle\EventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
class LocaleListener
{
public function setLocale(GetResponseEvent $event)
{
if (strstr(strtolower($_SERVER['HTTP_HOST']), strtolower('frdomain')))
{
$request = $event->getRequest();
$request->setLocale('fr');
}
}
}
If the HTTP_HOST contains the string 'frdomain', then set the locale to 'fr'.
Now register the listener in your bundle's services.yml file (it should be in Resources/config/). Inside, put this:
services:
my_custom.language.kernel_request_listener:
class: My\CustomBundle\EventListener\LocaleListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: setLocale }
Now every time a request is sent to Symfony, this listener runs first and sets the locale to 'fr' if it detects 'frdomain' in HTTP_HOST. Otherwise, it keeps the default locale (in this case, it's en).
That should work! Happy coding!