I'm using zend framework 2 and i'd like change the application language by clicking on a link for example.
this is my routing configuration :
'route'    => '/[:lang[/:controller[/:action[/:id]]]][[/page/:page]]',
and i'd defined en as default language :
'defaults' => array(
    'lang'     => 'en',
                   ),
on my module.php :
public function onBootstrap ($e) {
        $eventManager= $e->getApplication()->getEventManager();
        $routeCallback = function ($e) {
            $availableLanguages = array ('fr', 'en');
            $defaultLanguage = 'en';
            $language = "";
            $fromRoute = false;
            //see if language could be find in url
            if ($e->getRouteMatch()->getParam('lang')) {
                $language = $e->getRouteMatch()->getParam('lang');
                $fromRoute = true;
                //or use language from http accept
            } else {
                $headers = $e->getApplication()->getRequest()->getHeaders();
                if ($headers->has('Accept-Language')) {
                    $headerLocale = $headers->get('Accept-Language')->getPrioritized();
                    $language = substr($headerLocale[0]->getLanguage(), 0,2);
                }
            }
            if(!in_array($language, $availableLanguages) ) {
                $language = $defaultLanguage;
            }
            $e->getApplication()->getServiceManager()->get('translator')->setLocale($language);
        };
        $eventManager->attach(\Zend\Mvc\MvcEvent::EVENT_ROUTE, $routeCallback);
    }
Now this works perfectly, but i want to let the user change the language just by clicking on link for example.
Any suggestion??
Thanks for any help !
Maybe it's to late but here the solution to your question :
"Now this works perfectly, but i want to let the user change the language just by clicking on link for example."
you can do a menu in your navigation like this (using bootstrap)
<ul class="dropdown-menu">
                            <li><a href="<?= $this->url($this->route, array('lang' => 'fr'));?>">
                                <span class="flag fr"></span> Français
                            </a></li>
                            <li><a href="<?=$this->url($this->route, array('lang' => 'en'));?>">
                                <span class="flag gb"></span> English
                            </a></li>
                        </ul>
Assure that your po/mo/and other traduction file are matching the pattern "fr\en" etc...
And it will be work perfectly.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With