Zend Framework:Zend_translate和路由相关的问题

时间:2009-10-14 08:09:00

标签: zend-framework zend-translate

我在我的应用程序中实现了Zend_Navigation,Zend_Translate。 路由设置在Bootstrap.php中,如下所示。

$fc = Zend_Controller_Front::getInstance();
        $zl=new Zend_Locale();
        Zend_Registry::set('Zend_Locale',$zl);
        $lang=$zl->getLanguage().'_'.$zl->getRegion();
        $router = $fc->getRouter();
        $route = new Zend_Controller_Router_Route(':lang/:module/:controller/:action/*', 
        array(
    'lang'=>$lang, 'module'=>'default', 'controller'=>'index', 'action'=>'index'
));
$router->addRoute('default', $route);
$fc->setRouter($router);
$fc->registerPlugin( new Plugin_LanguageSetup());   
在LaunguageSetup插件中的

我已经定义了dispatchLoopStartup方法来检查语言参数

    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) {
        $this->createLangUrl($request);
        $this->_language = $request->getParam('lang');
        if ((!isset($this->_language)) || !in_array($this->_language, $this->_languagesArray)) {
            $this->_language = 'en_US';
            $request->setParam('lang', 'en_US');
        }
        $file = APPLICATION_PATH.$this->_directory.$this->_language.'.csv';
        $translate = new Zend_Translate('csv', $file, $this->_language);
        Zend_Registry::set('Zend_Translate', $translate);
        $zl = Zend_Registry::get('Zend_Locale');
        $zl->setLocale($this->_language);
        Zend_Registry::set('Zend_Locale', $zl);


//        $fc = Zend_Controller_Front::getInstance();
//        $router = $fc->getRouter();
//        $route = new Zend_Controller_Router_Route(':lang/:module/:controller/:action/*', array(
//            'lang'=>$this->_language, 'module'=>'default', 'controller'=>'index', 'action'=>'index'
//        ));
//        $router->addRoute('default', $route);
//        $fc->setRouter($router);

    }

语言总是有默认值,即使我在地址栏中手动输入'lang'param永远不会默认lang值,即使是/ en_US / module / controller / action /它总是得到恢复回到默认的Zend_locale();

我能解决的唯一方法是在插件中再次设置路由并注入正确的语言值作为默认值。任何想法为什么?

2 个答案:

答案 0 :(得分:0)

尝试在此行之前执行2个变量的var_dump(_language,_languagesArray)

if ((!isset($this->_language)) || !in_array($this->_language, $this->_languagesArray)) {

我怀疑它应该是问题,因为你把yor插件放在dispatchLoopStartup上,然后params可能没有填充,我把我的插件放在routeShutdown上看到我的implementation of the languange plugin

答案 1 :(得分:0)

部分解决方案的排序。

在dispatchLoopStartup

添加

$fc = Zend_Controller_Front::getInstance();
$router = $fc->getRouter();
$router->setGlobalParam('lang',$this->_language);

优于重新定义并再次覆盖路线,并通过更改默认的“lang”值来“伪造”语言参数。

它不仅仅是完美的。 Zend_router假设拿起'lang'参数并将它们放在Zend_navigation-> menu();