2013-06-30 128 views
2

我想知道zf2中是否有可能为路线/ uris使用翻译工具。我想要例如路线en.domain.tld/article/show/1来翻译,例如de.domain.tld/artikel/anzeigen/1。我不认为正则表达式是去这里的方式,因为它可能导致像en.domain.tld/artikel/show/1。另外我想避免为每种语言创建路由,因为随着系统规模的扩大,它会变得非常混乱。Zend Framework 2 - 翻译路线

回答

6

我能够得到它的工作!

首先,添加一个'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' => '...', 
       ) 
      ), 
     ), 
    ) 
); 

创建翻译(在这个例子中位于模块/语言/路由/ de_DE.php一个phpArray):

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

如果我没有忘记什么,你要善于去。我在我的情况下工作,所以如果它不符合上述说明,请不要犹豫,我会解决问题。

+0

这不适用于额外的控制台路由,对吧? '未捕获异常'Zend \ Mvc \ Router \ Exception \ RuntimeException''消息'没有翻译器提供' – MaiKaY

1

已经有一个实现,你会发现起始ZF 2.2.0。至于我可以告诉有此功能没有文档,但是看着单元测试时,你应该能够给这个一杆:

我要设法弄今天某个时候设置的一个工作示例,但不能做出任何承诺 - 测试应该让你开始寿命!

+0

看起来很有希望,并且肯定值得一试!谢谢! – machete

1

作为除上述onPreRoute回调:

您可能需要添加:

$ serviceManager-> GET( '路由器') - > setTranslatorTextDomain( 'TEXT_DOMAIN_HERE');

+0

Upvoted这个答案给了我一个单独的文本域只用于URL的想法。 –