2014-07-16 41 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')); 
    } 
    ... 
}