2

我已经在我的应用程序中实现了 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”参数永远不会在路由中使用默认语言值,即使我在地址栏中手动输入它,即 /en_US/module/controller/action/ 它总是恢复到默认 Zend_locale();

我可以修复它的唯一方法是在插件中再次设置路由并默认注入正确的语言值。任何想法为什么?

4

2 回答 2

0

一种部分解决方案。

在 dispatchLoopStartup 中

添加

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

比重新定义和覆盖路由并通过更改默认的“lang”值来“伪造”语言参数要好。

它还不够完美。Zend_router 假设获取 'lang' 参数并将它们放在 Zend_navigation->menu() 中;

于 2009-10-14T16:51:12.590 回答
0

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

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

我怀疑应该是问题所在,因为你把你的插件放在 dispatchLoopStartup 上,然后可能没有填充参数,我把我的插件放在 routeShutdown 上,看看我的语言插件的实现

于 2009-10-14T10:21:34.843 回答