Zend Framework 2 - translating routes

前端 未结 3 1016
情书的邮戳
情书的邮戳 2021-01-01 05:50

I am wondering if it is possible to use translational tools for routes/uris in zf2. I want for example the route en.domain.tld/article/show/1 to translate for e

相关标签:
3条回答
  • 2021-01-01 06:12

    As an addition to the onPreRoute callback above:

    You may need to add:

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

    0 讨论(0)
  • 2021-01-01 06:15

    I was able to get it working!

    First, add a 'router_class' => 'Zend\Mvc\Router\Http\TranslatorAwareTreeRouteStack', your module.config.php like this:

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

    Second, you must provide a translator (preferably in your module.php) as well as a translation file:

    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'));
        }
    }
    

    now, you should be able to use translations in your route definitions like the following:

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

    create the translation (in this example a phpArray located in module/language/routes/de_DE.php):

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

    If I didn't forget anything, you should be good to go. I got it working in my case, so if it doesn't with the instructions above, don't hesitate to comment and I'll sort things out.

    0 讨论(0)
  • 2021-01-01 06:15

    There is a implementation already which you will find starting ZF 2.2.0. As far as i can tell there is no Documentation for this feature, however when looking at the unit tests you should be able to give this a shot:

    • ZendTest\Mvc\Router\Http\SegmentTest

    I'll try to get a working example setup sometime today, but can't make any promises - the test should get you started tho!

    0 讨论(0)
提交回复
热议问题