1

これが私のブートストラップファイルにあるものです

/*
* Here the Translator is enabled and passed to
* Zend_Registry so can be accesed from anywhere
*/
public static function translateOption()
{
    Zend_Loader::loadClass('Zend_Translate');
    $translate = new Zend_Translate(
            'Zend_Translate_Adapter_Csv', 
            self::$root."/lang/en/language.csv", 
            'en');
    self::$registry->translate = $translate;
}

私が達成しようとしているのは、 mysite.com/language/controller/action のような URL です

これが私のルートです。

;Multilang routes
lang_default.type                                = "iM_Controller_Router_Route_Language"
lang_default.route               = ":language/:controller/:action/*"
lang_default.defaults.module     = default
lang_default.defaults.controller = index
lang_default.defaults.action     = index
lang_default.defaults.language   = en
lang_default.reqs.language       = "(ro|en)"

インターネットで見つけたルート コントローラー プラグインは次のとおりです。

<?php

/**
* Front Controller Plugin; Created by Gabriel Solomon (http://www.gsdesign.ro/blog/optimizing-zend-routing/)
*
* @uses       Zend_Controller_Plugin_Abstract
* @category   iM
* @package    iM_Controller
* @subpackage Plugins
*/
class iM_Controller_Plugin_Router extends Zend_Controller_Plugin_Abstract{
    protected $_dir;
    protected $_default = array();
    protected $_request;

    protected $_initialConfig;
    protected $_remainingConfig;


    public function routeStartup(Zend_Controller_Request_Abstract $request)
    {
        // define some routes (URLs)
        $router = Zend_Controller_Front::getInstance()->getRouter();       
        $this->setRequest($request);       

        $config = $this->getInitial();
        $router->addConfig($config);
    }


    public function routeShutdown(Zend_Controller_Request_Abstract $request)
    {
        $router = Zend_Controller_Front::getInstance()->getRouter();

        $config = $this->getRemaining();

        $router->addConfig($config);
    }

    public function setDir($dir) {
        $this->_dir = $dir;
    }


    public function setDefault($default) {
        if (is_array($default)) {
            $this->_default = array_merge($this->_default, $default);
        } else {
            $this->_default[] = $default;
        }
    }


    public function setRequest(Zend_Controller_Request_Abstract $request) {
        $this->_request = $request;
        //return $this;
    }

    public function getInitial() {
        if ($this->_initialConfig == null) {
            $this->parseIniDir();
        }

        return $this->_initialConfig;

    }


    public function getRemaining() {
        if ($this->_remainingConfig == null) {
            $this->parseIniDir();
        }

        return $this->_remainingConfig;
    }

    protected function parseIniDir() {
        $files = $this->getFiles();
        $this->_default;

        $this->_default[] = $this->determineInitial();

        $this->_initialConfig = new Zend_Config(array(), true);
        $this->_remainingConfig = new Zend_Config(array(), true);       

        if (is_array($files)) {

            foreach ($files as $file) {
                $routerFile = $this->compilePath($file);

                if (in_array($file, $this->_default)) {
                    $this->_initialConfig->merge(new Zend_Config_Ini($routerFile));

                } else {
                    $this->_remainingConfig->merge(new Zend_Config_Ini($routerFile));
                }
            }
        }
    }

    protected function getFiles() {
        if (is_dir($this->_dir)) {
            $dir = new DirectoryIterator($this->_dir);
            $files = array();
            foreach($dir as $fileInfo) {
                if(!$fileInfo->isDot() && $fileInfo->isFile()) {
                    $files[] = $fileInfo->__toString();
                }
            }

            return $files;
        }

        return false;
    }


    protected function getOtherRoutes() {
        $routes->merge(new Zend_Config_Ini($routerFile));
    }


    protected function determineInitial() {
        if ($this->_request) {
            $uri = $this->_request->getRequestUri();
            $base = $this->_request->getBasePath() . '/';

            $request = str_replace($base, '', $uri);
            $requestParts = explode('/', $request);

            $lang = $requestParts[0];
            (array_key_exists(1,$requestParts) ? $section = $requestParts[1] : $section = '');

            if (!empty($section) && $section == 'user') {
                return 'user.ini';
            }

        }
        return false;
    }


    protected function compilePath($file) {
        return $this->_dir . '/' . $file;
    }
}

URL が /en または /ro または /de の場合、ブートストラップ関数で変更する必要があると思いますが、どうすれば言語を変更できますかtranslateOption? ..しかし、私は今のところ幸せです URLが変更された場合に言語を変更する方法を教えていただければ、ありがとうございます!

誰かがこれを読んでくれるかどうかはわかりませんが、そう願っています

4

1 に答える 1

0

ブートストラップ プロセス中、アプリケーションはまだ URL の内容を「認識」していません。ブートストラップは、アプリケーションを準備し、実行するために役立ちます。そのため、ブートストラップ プロセスの後、ディスパッチ ループが開始されます。URL はルーティング中に解析され、URL が解析されると、ディスパッチ プロセスはルートからの詳細に関連付けられたモジュール/コントローラー/アクションを呼び出します。

ブートストラップで翻訳を読み取って構成する代わりに、コントローラー プラグインで行うことをお勧めします。ディスパッチ ループのさまざまなステップで、各コントローラー プラグインの特定のメソッドが呼び出されます。

サンプルは次のとおりです。

class Application_Model_Language extends Zend_Controller_Plugin_Abstract
{
    public function routeShutdown(\Zend_Controller_Request_Abstract $request)
    {
        // ask the language from the $request object
        // load the translation data
    }
}

あとは、プラグインをディスパッチループに追加することを Zend_Application に伝えるだけです。これは、ブートストラップ中に行われます。したがって、これを一般的な Bootstrap.php に入れるか、モジュール固有の Bootstrap.php に入れます。

protected function _initTranslations()
{
    $this->bootstrap('frontController');
    $front = $this->getResource('frontController');
    $front->registerPlugin(new Application_Model_Language());
}
于 2012-11-06T13:52:49.437 に答える