2014-07-16 81 views
2

我想知道如何转换ZF2中的整个路由。我已经试过了:Zend \ Mvc \ Router \ Http \ TranslatorAwareTreeRouteStackZend Framework 2 - 包括控制器和动作的路由转换

它固定部分我的问题,我仍然不能翻译一个动作或控制器,这就是我想知道的。

这是我到目前为止,我可以翻译“{}新”,而不是“:行动”

 'news' => array(
      'type' => 'Segment', 
      'options' => array(
       'route' => '/[:locale/]{news}[/page/:page][/:action[/:id]]', 
       'defaults' => array(
        'controller' => 'Application\Controller\News', 
        'action' => 'news' 
       ), 
      ), 
     ), 

的TRADUCTION是在一个PHP文件中的阵列称为“fr.php” :

return array(
    'news' => 'nouvelles', 
    'details' => 'dd' 
); 

“details”是我的动作,我想翻译。

我模块类:

namespace Application; 

use Zend\Mvc\ModuleRouteListener; 
use Zend\Mvc\MvcEvent; 
use Zend\Config\Reader\Xml as Xml; 

class Module 
{ 
    public function onBootstrap(MvcEvent $e) 
    { 
    $eventManager  = $e->getApplication()->getEventManager(); 
    $moduleRouteListener = new ModuleRouteListener(); 
    $moduleRouteListener->attach($eventManager); 

    // Réglage de la langue 
    $routeCallback = function ($e) { 
     $availableLanguages = array ('fr', 'en'); 
     $defaultLanguage = 'fr'; 

     $fromRoute = false; 
     //see if language could be find in url 
     if ($e->getRouteMatch()->getParam('locale')) { 
      $language = $e->getRouteMatch()->getParam('locale'); 
      $fromRoute = true; 

      //or use language from http accept 
     } else { 
      $headers = $e->getApplication()->getRequest()->getHeaders(); 
      if ($headers->has('Accept-Language')) { 
       $headerLocale = $headers->get('Accept-Language')->getPrioritized(); 
       $language = substr($headerLocale[0]->getLanguage(), 0,2); 
      } 
     } 
     if(!in_array($language, $availableLanguages)) { 
      $e->getResponse()->setStatusCode(404); 
      return; 
     } 
     $e->getApplication()->getServiceManager()->get('translator')->setLocale($language); 

    }; 

    $eventManager->attach(\Zend\Mvc\MvcEvent::EVENT_ROUTE, $routeCallback); 

    // Traduction du routeur 
    // Load translator 
    $translator = $e->getApplication()->getServiceManager()->get('translator'); 
    // setup the translation file. you can use .mo files or whatever, check the translator api 
    $language = (preg_match('/\/en\//', $_SERVER["REQUEST_URI"])) ?'en' :'fr'; 
    $translator->addTranslationFile('PhpArray', __DIR__.'/language/fr.php', 'default', $language); 
    $app = $e->getTarget(); 

    // Route translator 
    $app->getEventManager()->attach('route', array($this, 'onPreRoute'), 100); 

    // Application Configuration 
    $serviceManager = $e->getApplication()->getServiceManager(); 
    $viewModel = $e->getApplication()->getMvcEvent()->getViewModel(); 
    $reader = new Xml(); 
    $appConfig = $reader->fromFile('public/ApplicationConfiguration.xml'); 
    $viewModel->appConfig = $appConfig; 

    $viewModel->translator = $e->getApplication()->getServiceManager()->get('translator'); 

} 

public function onPreRoute($e){ 
    $app  = $e->getTarget(); 
    $serviceManager  = $app->getServiceManager(); 
    $serviceManager->get('router')->setTranslator($serviceManager->get('translator')); 
} 

public function getConfig() 
{ 
    return include __DIR__ . '/config/module.config.php'; 
} 

public function getAutoloaderConfig() 
{ 
    return array(
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
      ), 
     ), 
    ); 
} 

}

我怎么能翻译控制器和行动?

回答

0

万一你没有找到一个妥善的解决办法,我这样做,是我这样定义

'news_fr' => array(
     'type' => 'Segment', 
     'options' => array(
      'route' => '/[:locale/]{news}[/page/:page][/:action[/:id]]', 
      'defaults' => array(
       'controller' => 'Application\Controller\News', 
       'action' => 'notice' 
      ), 
     ), 
    ), 


    'news_eng' => array(
     'type' => 'Segment', 
     'options' => array(
      'route' => '/[:locale/]{news}[/page/:page][/:action[/:id]]', 
      'defaults' => array(
       'controller' => 'Application\Controller\News', 
       'action' => 'news' 
      ), 
     ), 
    ), 

,然后在视图/布局路线的方式,我做

<?= $this->url('news_'.$currentLanguage, array('par1',...)); ?> 
+0

该解决方案意味着我必须加倍一些操作。我更喜欢不使用不同名称的两个操作来完成相同的操作,但感谢解决方案。 – KVS

+0

但是你问的是翻译这个动作,所以无论如何你会对每种语言都有一个动作。我错了吗? – peterpeterson

+0

我想动态地翻译我的动作,就像我为{news}所做的那样:当我在«news»上使用brakets时,我可以使用fr.php动态翻译它。如果输入en/news或fr/nouvelles,它会转到相同的同样的看法。我想为我的控制器和我的操作做同样的事情,但我不能这样做{:action}。想象一下,你必须用多种语言进行翻译,你不想有很多路由器(例如,news_fr,news_en,news_it,...)。我不想为每种语言采取行动,我希望对所有语言采取一种行动就像我为{新闻}所做的一样。我可以在Zend 1中用@控制器做到这一点,但它似乎不适用于Zend 2 – KVS

0

只是简单的,在航线配置

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

在功能onBootstrap在Module.php

class Module 
{ 
    public function onBootstrap(MvcEvent $e) 
    { 
     $eventManager = $e->getApplication()->getEventManager(); 
     $moduleRouteListener = new ModuleRouteListener(); 
     $eventManager->attach('route', array($this, 'onPreRoute'), 100); 
     $moduleRouteListener->attach($eventManager); 
    } 
    public function onPreRoute($e) 
    { 
     $app = $e->getTarget(); 
     $serviceManager = $app->getServiceManager(); 
     $serviceManager->get('router')->setTranslator($serviceManager->get('translator')); 
    } 
    ... 
} 
相关问题