Zend framework 2 : How to set locale globaly?
Solution 1
Set up the default locale at configuration level! See #61 of module.config.php
from ZendSkeletonApplications Application Module
'translator' => array(
'locale' => 'en_US',
)
Solution 2
I had the same issue. In my user login module, I registered for MvcEvent on bootstrap:
use Zend\Mvc\MvcEvent;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Session\SessionManager;
use Zend\Session\Container as SessionContainer;
use \Zend\I18n\Translator\TranslatorInterface;
...
public function onBootstrap(MvcEvent $event)
{
// Get event manager.
$eventManager = $event->getApplication()->getEventManager();
$sharedEventManager = $eventManager->getSharedManager();
// Register the event listener method.
$sharedEventManager->attach(AbstractActionController::class,
MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch'], 100);
}
Then when that event comes, I set the locale based on info from the URL:
public function onDispatch(MvcEvent $event)
{
$servicemanager = $event->getApplication()->getServiceManager();
$lang = $event->getRouteMatch()->getParam('lang','jp-JP');
$translator = $servicemanager->get(TranslatorInterface::class);
if( $translator != null )
{
$translator->setLocale($lang);
}
...
In the end, this does not really make the locale global - instead, it just sets it for every request. The net effect is the same, from the code point of view - i.e., I don't have to set the locale on every controller.
Hope that helps.
Comments
-
sgleser87 almost 2 years
I have to change the locale dynamically depending which language the user wants.
I can set the locale in the Application/Module.php like this :
public function onBootstrap(MvcEvent $e) { $translator = $e->getApplication()->getServiceManager()->get('translator'); $translator->setLocale('hu_HU'); }
But, how can I do this in the controller, if I want to change languages ? I tried this, but after this I can change the locale only for this one request and not global.
$translator = $this->getServiceLocator()->get('translator'); $translator->setLocale('srb_SRB');
-
sgleser87 about 11 yearsBut I have to change it dynamically, depending on user.
-
Sam about 11 yearsThat would be set per Request then, based on Users Session data (or UserEntity)
-
Matteo Tassinari about 11 years@sgleser87 the point is that you must not change it in the code, which must contain only the default value
-
sgleser87 about 11 yearsOk, but how do you handle than language changes ? You have to set it on every request again? That's too much code which you should set only once.
-
Sam about 11 yearsThis is what SESSION-DATA is about. Yes, you have to re-change it on every single request. You can not write an application on a per-user-basis, but you can change data depending on the user. THis is what you code for Oo
-
Bineet Chaubey over 10 years@Sam i am trying to set local $translator->getLocale('hin_IN'); but found always a default local when i am using this $translator->getLocale(); give en_IN but i am wondor i did not add this local in any location in my project . this is working in 2.1.1 perfect but not work in 2.3.3dev when i upgrade this version . please help me.