Zend_Translate - Zend_Navigation和Routing组合问题!

时间:2010-02-27 08:22:32

标签: php zend-framework zend-navigation zend-route zend-translate

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

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

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 /模块2 /控制器2 /“

我无法弄清楚你的at / da /语言。 任何帮助都会得到满足。

亲切的问候,

的Morten

2 个答案:

答案 0 :(得分: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()已经完成。

答案 1 :(得分:1)

因为Zend_Navigation_Page_Mvc只检查Module,Controller和Action,所以看起来它永远不会转到其他路由元素。

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

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

这是我的xml配置导航2页“home”,“test”用法语和英语:

<?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页很长。 实际上,您将在导航中有(页面+ 1)x种语言项目

我确实使用了'技巧':主页出现两次。

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

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

<?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

我希望这会有所帮助。

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