Zend Framework 2-翻译路由



我想知道是否可以在zf2中使用路由/uris的翻译工具。例如,我希望将路由en.domain.tld/article/show/1转换为例如de.domain.tld/artikel/anzeigen/1。我不认为regex是解决问题的方法,因为它可能会产生类似en.domain.tld/artikel/show/1的结果。此外,我希望避免为每种语言创建路由,因为随着系统的扩展,路由会变得非常混乱。

我能够让它工作!

首先,添加一个'router_class' => 'ZendMvcRouterHttpTranslatorAwareTreeRouteStack',您的module.config.php,如下所示:

return array (
    'router' => array (
        'router_class' => 'ZendMvcRouterHttpTranslatorAwareTreeRouteStack',
        'routes' => array(),
    )
);

其次,您必须提供一个翻译器(最好在您的模块.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' => 'ZendMvcRouterHttpSegment',
            'may_terminate' => true,
            'options' => array (
                'route' => '/{login}',
                'defaults' => Array(
                    'controller' => '...',
                ) 
            ),
        ),
    )
);

创建翻译(在本例中,phpArray位于module/language/routes/de_de.php中):

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

如果我什么都没忘,你就可以走了。我在我的情况下做到了,所以如果它不符合上面的说明,请毫不犹豫地发表评论,我会解决问题的。

已经有一个实现,您可以在启动ZF 2.2.0时找到它。据我所知,这个功能没有文档,但是当查看单元测试时,你应该能够尝试一下:

  • ZendTestMvcRouterHttpSegmentTest

今天的某个时候,我会尝试获得一个工作示例设置,但不能做出任何承诺——测试应该会让你开始!

作为上面onPreRoute回调的补充:

您可能需要添加:

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

最新更新