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 Plugin で、言語パラメーターのチェックを行うために 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」パラメーターはデフォルトの 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 に答える