我有一个类似的问题并想通了,试试:
$e->getRouter()->setDefaultParam('lang', 'de_DE');
我正在使用侦听器在 MvcEvent::EVENT_DISPATCH 上触发此操作(请参阅下面的更新说明),但 onBootstrap inModule.php
也应该可以工作。
更新:
好的,现在我发现将默认参数应用于路由器为时MvcEvent::EVENT_DISPATCH
已晚。尤其是当您不仅对通过路由传递语言感兴趣,而且对拥有可翻译的路由(与 结合'router_class'=>'Zend\Mvc\Router\Http\TranslatorAwareTreeRouteStack'
)感兴趣时。
所以它应该在 MvcEvent::EVENT_ROUTE 上:
// applying a default language param to route
$e->getRouter()->setDefaultParam('lang', 'de_DE');
// Now detect the requested language or retrieve
// from matched route
// $detectedLocale =...
// ...
// Retrieve the translator
$sm->get('translator');
// Apply detected locale to the translator
$translator->setLocale($detectedLocale);
// and now this apply the translator to the router
// for translatable routes
$e->getRouter()->setTranslator($translator);
// but don't forget about
// 'router_class'=>'Zend\Mvc\Router\Http\TranslatorAwareTreeRouteStack'
// for translatable routes
我看到人们说,您应该在 中执行此操作onBootstrap()
,但是 IMVHO 太早了,无法onBootstrap
检索 a matched route
,这是检测客户端在 route/url 参数中传递的语言环境/语言所必需的。
通过说“检测语言环境”,我绝对不是在考虑对url/查询字符串进行任何脏字符串操作,而是在考虑对getParam()
匹配路由进行清理。
相关:
http: //framework.zend.com/manual/2.2/en/modules/zend.mvc.mvc-event.html