我正在使用zend框架2,我想通过点击链接来更改应用程序语言。
这是我的路由配置:
'route' => '/[:lang[/:controller[/:action[/:id]]]][[/page/:page]]',
我将en定义为默认语言:
'defaults' => array(
'lang' => 'en',
),
在我的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);
}
现在这完美无缺,但我想让用户只需点击链接即可更改语言。
有什么建议吗?
感谢您的帮助!
答案 0 :(得分:1)
也许是为了迟到,但这里是你问题的解决方案:
“现在这完美无缺,但我想让用户改变它 只需点击链接即可获得语言。“
你可以在导航中做这样的菜单(使用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>
确保您的po / mo /和其他转录文件与“fr \ en”等模式匹配...
它将完美地运作。
答案 1 :(得分:0)
根据我的经验,始终将语言存储在URL中是一种很好的做法。这样,您将拥有不同语言页面的唯一地址。否则,在同一个网址上,将显示每种语言的不同内容,并且您将不知道为机器人显示的语言,如果应用程序是网站,这很重要。使用这种方法,为用户提供多语言链接应该不难。