3

我需要动态更改我的语言应用程序。我有以下路线配置:

'route'    => '/[:lang[/:controller[/:action[/:id]]]][[/page/:page]]',

'defaults' => array(
'lang'     => 'en',
        ),

是否可以从我的控制器或我的 Module.php(函数 onBootstrap)更改参数“lang”。我不知道我是否可以使用全局变量或类似的东西。

'defaults' => array(
'lang'     => $my_variable,
        ),

如果可能的话,我该如何改变它?

谢谢你的帮助!

4

2 回答 2

6

我有一个类似的问题并想通了,试试:

$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

于 2013-12-17T22:58:18.140 回答
1

设置路由的方式总是必须包含 lang 参数才能访问默认控制器以外的任何内容。

URL: '/' 将具有 lang 'en' 和控制器 'default' 等。 URL: '/es' 将具有 lang 值 'es' 和控制器 'default' URL: '/es/about' 将具有 lang 值' es' 和控制器 'about' URL: '/about' 将尝试将 lang 设置为 'about' 并可能破坏路由。

您可以并且应该在 Module::onBootstrap 中更改翻译器的语言代码。您将可以通过 MvcEvent 对象访问那里的路由参数。

于 2013-08-14T10:49:06.727 回答