Zend Framework 2 - 翻译路线

时间:2013-06-30 23:04:59

标签: php zend-framework2 routes translate

我想知道是否可以在zf2中为routes / uris使用转换工具。我希望例如将路线en.domain.tld/article/show/1转换为例如de.domain.tld/artikel/anzeigen/1。我不认为正则表达式是这里的方式,因为它可能会导致en.domain.tld/artikel/show/1之类的东西。另外,我想避免为每种语言创建路由,因为随着系统的扩展,它会变得非常混乱。

3 个答案:

答案 0 :(得分: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' => '...',
                ) 
            ),
        ),
    )
);

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

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

如果我没有忘记任何事情,你应该好好去。我在我的情况下工作,所以如果它不符合上述说明,请不要犹豫,我会解决问题。

答案 1 :(得分:1)

已经有一个实现,你会发现启动ZF 2.2.0。据我所知,没有关于此功能的文档,但是在查看单元测试时,您应该可以尝试一下:

我会尝试在今天的某个时间设置一个有效的示例,但不能做出任何承诺 - 测试应该让你开始吧!

答案 2 :(得分:1)

作为上述onPreRoute回调的补充:

您可能需要添加:

$ serviceManager-&GT;获得( '路由器') - &GT; setTranslatorTextDomain( '的 TEXT_DOMAIN_HERE ');