У меня была аналогичная проблема, и я понял это, попробуйте:
$e->getRouter()->setDefaultParam('lang', 'de_DE');
Я запускаю это на MvcEvent::EVENT_DISPATCH (см. примечание об обновлении ниже) с использованием прослушивателя, но onBootstrap в Module.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
СЛИШКОМ РАНО для получения matched route
, которое требуется для определения локали/языка, переданного клиентом в параметре маршрута/url.
Говоря «обнаружение языкового стандарта», я определенно не думаю о каких-либо операциях с грязными строками в строке URL/запроса, я думаю о чистом getParam()
на совпавшем маршруте.
Связано: http://framework.zend.com/manual/2.2/en/modules/zend.mvc.mvc-event.html
person
Thomas Szteliga
schedule
17.12.2013