9

我在 Zend_Navigation、Zend_Translate 和所需路由的组合方面遇到了一些困难。

我的站点导航是通过基于 XML 文件的 Zend_Navigation 完成的。我现在已经基于 Zend_Translate 向站点添加了翻译,并添加了以下对引导程序的路由更改:

protected function _initRoutes()

    $config = new Zend_Config($this->getOptions());
    $languages = array_keys($config->languages->toArray());
    $zl = new Zend_Locale();
    $lang = in_array($zl->getLanguage(), $languages)
                  ? $zl->getLanguage() : 'en';

    $zfc = Zend_Controller_Front::getInstance();


    // add language to default route
    $route = new Zend_Controller_Router_Route(
            ':lang/:module/:controller/:action/*',
      array('controller'=>'index',
                'action' => 'index',
                'module'=>'default',
                'lang'=>$lang));

    $router = $zfc->getRouter();
    $router->addRoute('default', $route);
    $zfc->setRouter($router);

然后,我使用 preDispatc 方法创建了一个 View_Helper:

    $language = $request->getParam('lang','');

 if ($language !== 'en' && $language !== 'da')
     $request->setParam('lang','en');

 $language = $request->getParam('lang');
 if ($language == 'en')
     $locale = 'en_EN';
 else
     $locale = 'da_DK';

 $zl = new Zend_Locale();
 $zl->setLocale($locale);
 Zend_Registry::set('Zend_Locale', $zl);

 $translate = new Zend_Translate('csv', APPLICATION_PATH . '/configs/language/'. $language . '.csv' , $language);
 Zend_Registry::set('Zend_Translate', $translate);

现在,当我转到:“site/ en /module/controller/action”时,它工作正常。

当我转到:“site/ da /module/controller/action”时,翻译工作正常,但我来自 Zend_Navigation 的链接指向默认的“en”语言链接“site/ en /module2/controller2/”

我无法弄清楚您在 /da/ 的语言。任何帮助都将不胜感激。

亲切的问候,

莫腾

4

2 回答 2

1

这并不能直接回答您的问题。但是 Zend_View_Helper_Navigation,导航的视图助手,有一个 setTranslator() 方法,它将提供您添加到 Zend_Navigation 容器的导航“页面”的隐式翻译。

class MyModule_Bootstrap extends Zend_Application_Module_Bootstrap
{
   protected function _initMyModuleNavigation()
   {
    $langSess = new Zend_Session_Namespace('language');
    $translate = $langSess->translate;

    $this->getApplication()->bootstrap('navigation');

    $view = $this->getApplication()->getResource('view');

    $navigationHelper = $view->getHelper('navigation');

    $navigation = $navigationHelper->getContainer();

    $navigationHelper->setTranslator($translate);

    //...
}

这使您不必为每个项目手动调用翻译

$navigation->addPages(array(
        new Zend_Navigation_Page_Mvc(array(
            'label' => $translate->_('Wiki'), //<-- This can be eliminated
            'action' => 'index',
            'controller' => 'article',
            'module' => 'wiki',
            'pages' => //...

因为它会自动完成,因为 setTranslator() 已经完成。

于 2011-05-20T19:18:52.463 回答
1

因为 Zend_Navigation_Page_Mvc 只检查 Module、Controller 和 Action,它看起来永远不会去额外的路由元素。

一种解决方案可能是使用一个新类,例如:Zend_Navigation_Page_Mvcl,它将处理语言。

但这似乎有点复杂,所以我通过使用更大的导航找到了一个解决方案,其中包括所有语言的所有页面。

这是我的 xml 配置,用于导航 2 页“主页”、“测试”的法语和英语:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <nav>
        <fr>
            <label>menu.home</label>
            <params>
                <lang>fr</lang>
            </params>
            <action>index</action>
            <controller>homepage</controller>
            <route>langcontrolleraction</route>
            <pages>
                <home>
                    <label>menu.home</label>
                    <params>
                        <lang>fr</lang>
                    </params>
                    <action>index</action>
                    <controller>homepage</controller>
                    <route>langcontrolleraction</route>
                </home>
                <test>
                    <label>menu.wallet</label>
                    <params>
                        <lang>fr</lang>
                    </params>
                    <action>index</action>
                    <controller>wallet</controller>
                    <route>langcontrolleraction</route>
                </test>
            </pages>
        </fr>
        <en>
            <label>menu.home</label>
            <params>
                <lang>en</lang>
            </params>
            <action>index</action>
            <controller>homepage</controller>
            <route>langcontrolleraction</route>
            <pages>
                <home>
                    <label>menu.home</label>
                    <params>
                        <lang>en</lang>
                    </params>
                    <action>index</action>
                    <controller>homepage</controller>
                    <route>langcontrolleraction</route>
                </home>
                <test>
                    <label>menu.wallet</label>
                    <params>
                        <lang>en</lang>
                    </params>
                    <action>index</action>
                    <controller>wallet</controller>
                    <route>langcontrolleraction</route>
                </test>
            </pages>
        </en>
    </nav>
</config>

如您所见,仅 2 页就很长了。实际上,您将在导航中有 (pages + 1) x 个语言项目

我确实使用了一个“技巧”:主页出现了两次。

  • 一次作为主菜单项
  • 一次作为第一个子菜单项

这个想法是根据所选语言定义要显示的子菜单,这是通过路由器自动完成的,因此您所要做的就是告诉您的应用程序绘制子菜单而不是菜单。所以这是我在布局文件中使用的行:

<?php 
echo $this->navigation()->menu()->renderSubMenu() 
?>

我没有看到你是如何添加Zend_Navigation的,所以这是我的Bootstrap.php

<?php
protected function _initNavigation() {
    $config = new Zend_Config_Xml(Zend_Registry::get ( 'config' )
            ->resources->navigation->file, 'nav');
    $navigationContainer = new Zend_Navigation($config);
    // Store the container in the proxy helper:
    $view = $this->getResource ( 'view' );
    $view->getHelper('navigation')->setContainer($navigationContainer);
}
?>

顺便说一句,在同一个Bootstrap.php中,我可以将默认语言保留为“en”,这是我的_initRoutes()

<?php
protected function _initRoutes() {
    $router = Zend_Controller_Front::getInstance ()->getRouter ();
    $router->removeDefaultRoutes ();
    $myRoute = new Zend_Controller_Router_Route (
        ':lang/:controller/:action',
        array (
            'lang' => 'en',
            'controller' => 'index',
            'action' => 'index',
        )
    );
    $router->addRoute ( 'langcontrolleraction', $myRoute );
}
?>

如果您注册了 Zend_Translate,它会自动完成翻译。在我的示例中: menu.home 将给出:

  • 英文首页
  • 法语中的Accueil

我希望这有帮助。

我更喜欢另一个更微妙的解决方案,但我还没有找到它。

于 2011-09-15T23:44:13.810 回答