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.