Мне интересно, можно ли использовать трансляционные инструменты для маршрутов / 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
. Также я хочу избежать создания маршрутов для каждого языка, потому что он будет довольно грязным, поскольку система масштабируется.
Я смог заставить его работать!
Сначала добавьте '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 ');