【问题标题】:Zend Framework 2 - Route translation including Controller and ActionZend Framework 2 - 路由翻译,包括控制器和动作
【发布时间】:2014-07-16 01:42:10
【问题描述】:

我想知道如何在 ZF2 中翻译整条路线。我已经尝试过:Zend\Mvc\Router\Http\TranslatorAwareTreeRouteStack

它部分解决了我的问题,我仍然无法翻译动作或控制器,这就是我想知道的。

这就是我目前所拥有的,我可以翻译“{new}”,但不能翻译“:action”

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

翻译位于名为“fr.php”的 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__,
            ),
        ),
    );
}

}

如何翻译控制器和动作?

【问题讨论】:

    标签: php zend-framework zend-framework2


    【解决方案1】:

    以防万一你找不到合适的解决方案,我这样做的方式是定义一个类似的路线

        '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',...)); ?>
    

    【讨论】:

    • 那个解决方案意味着我必须将一些事情加倍,比如动作。我不希望有两个名称不同的动作做同样的事情,但感谢您的解决方案。
    • 但是你要求的是翻译动作,所以无论如何你都会对每种语言都有一个动作。我错了吗?
    • 我想动态翻译我的动作,就像我为 {news} 所做的那样:当我在 «news» 上使用刹车时,我可以使用 fr.php 动态翻译它。如果我输入 en/news 或 fr /nouvelles 它进入相同的视图。我想对我的控制器和我的操作做同样的事情,但我不能做 {:action}。想象一下,您必须翻译多种语言,您不希望有很多路由器(例如«news_fr、news_en、news_it,...)。我不希望对每种语言采取行动我希望对所有语言采取行动就像我为 {news} 所做的那样。我觉得你可以在 Zend 1 中使用 @controller 做到这一点,但它似乎在 Zend 2 中不起作用
    • 啊,好的,我现在明白了,对不起。所以我认为这不是翻译,因为您尝试在内部替换 :action 之前翻译它。就像快速测试一样,您能否尝试在您的 fr 文件上添加键 :action 并在路由上像 {:action} 一样执行它。就是看有没有翻译,如果有,我们再多修改寻找解决办法
    【解决方案2】:

    很简单,在路由配置中

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

    在Module.php中的onBootstrap函数中

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 2015-04-23
      相关资源
      最近更新 更多