Zend Framework 2 – переводные маршруты

Мне интересно, можно ли использовать трансляционные инструменты для маршрутов / uris в zf2. Я хочу, например, en.domain.tld/article/show/1 маршрут en.domain.tld/article/show/1 для перевода, например, в de.domain.tld/artikel/anzeigen/1 . Я не думаю, что regex – это путь, потому что это может привести к чему-то вроде en.domain.tld/artikel/show/1 . Также я хочу избежать создания маршрутов для каждого языка, потому что он будет довольно грязным, поскольку система масштабируется.

Solutions Collecting From Web of "Zend Framework 2 – переводные маршруты"

Я смог заставить его работать!

Сначала добавьте 'router_class' => 'Zend\Mvc\Router\Http\TranslatorAwareTreeRouteStack', ваш module.config.php как это:

 return array ( 'router' => array ( 'router_class' => 'Zend\Mvc\Router\Http\TranslatorAwareTreeRouteStack', 'routes' => array(), ) ); 

Во-вторых, вы должны предоставить переводчика (желательно в вашем module.php), а также файл перевода:

 class Module { public function onBootstrap(MvcEvent $e) { // Load translator $translator = $e->getApplication()->getServiceManager()->get('translator'); $translator->setLocale('de_DE'); // setup the translation file. you can use .mo files or whatever, check the translator api $translator->addTranslationFile('PhpArray', __DIR__.'/language/routes/de_DE.php', 'default', 'de_DE'); $app = $e->getTarget(); // Route translator $app->getEventManager()->attach('route', array($this, 'onPreRoute'), 100); } public function onPreRoute($e){ $app = $e->getTarget(); $serviceManager = $app->getServiceManager(); $serviceManager->get('router')->setTranslator($serviceManager->get('translator')); } } 

теперь вы сможете использовать переводы в определениях маршрутов, например:

 return array ( 'router' => array ( 'routes' => array( 'login' => array ( 'type' => 'Zend\Mvc\Router\Http\Segment', 'may_terminate' => true, 'options' => array ( 'route' => '/{login}', 'defaults' => Array( 'controller' => '...', ) ), ), ) ); 

создайте перевод (в этом примере phpArray, расположенный в модуле / язык / маршруты / de_DE.php):

 <?php return array( 'login' => 'anmelden', ); 

Если я ничего не забуду, вам должно быть хорошо идти. Я получил его работу в моем случае, поэтому, если это не соответствует вышеприведенным инструкциям, не стесняйтесь комментировать, и я все выясню.

Уже есть реализация, которую вы найдете начиная с ZF 2.2.0. Насколько я могу судить, нет никакой документации для этой функции, однако, глядя на модульные тесты, вы должны уметь это сделать:

  • ZendTest\Mvc\Router\Http\SegmentTest

Я постараюсь установить рабочий пример, например, сегодня, но не могу делать никаких обещаний – тест должен заставить вас начать!

В дополнение к обратному вызову onPreRoute выше:

Вам может потребоваться добавить:

$ serviceManager-> get ('router') -> setTranslatorTextDomain (' TEXT_DOMAIN_HERE ');