我需要动态更改语言应用程序。 我有以下路线配置:
'route' => '/[:lang[/:controller[/:action[/:id]]]][[/page/:page]]',
'defaults' => array(
'lang' => 'en',
),
是否可以从我的控制器或我的Module.php(函数onBootstrap)更改参数'lang'。我不知道我是否可以使用全局变量或类似的东西。
'defaults' => array(
'lang' => $my_variable,
),
如果有可能,我该如何更改?
谢谢你的帮助!
答案 0 :(得分:3)
我遇到了类似的问题并想出来了,试试:
$e->getRouter()->setDefaultParam('lang', 'de_DE');
我在MvcEvent :: EVENT_DISPATCH(请参阅下面的更新说明)中使用监听器触发此操作,但Module.php
中的onBootstrap也应该正常工作。
<强>更新强>
好的,现在我看到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
很早就检索到matched route
,这是检测传递的语言环境/语言所必需的路由/ url参数中的客户端。
通过说“检测语言环境”,我肯定没有考虑对url / query字符串的任何脏字符串操作,我正在考虑匹配上的干净getParam()
路由。
相关: http://framework.zend.com/manual/2.2/en/modules/zend.mvc.mvc-event.html
答案 1 :(得分:1)
您的路线设置方式总是需要包含lang参数来访问默认控制器以外的任何其他内容。
网址:'/'将包含lang'en'和控制器'default'等。 网址:'/ es'将包含lang值'es'和控制器'default' 网址:'/ es / about'将包含lang值'es'和控制器'about' URL:'/ about'会尝试将lang设置为'about',并可能会破坏路径。
你可以&amp;应该在Module :: onBootstrap中更改翻译器的语言代码。您可以通过MvcEvent对象访问路由参数。