0

我想知道是否有人可以帮助我解决下一个问题。

我希望能够在有和没有 Uri lang 标志的情况下使用多语言支持设置我的项目,并且还可以使用模块结构。

我的意思是

http://mydomain/
http://mydomain/forum
http://mydomain/gallery 

使用 Zend_Locale + Zend_Translate 默认值在没有 lang uri 参数的情况下导航 (en)

并且 :

http://mydomain/es
http://mydomain/es/forum
http://mydomain/es/gallery

我已经按照我找到的一些tutos,但我仍然不能这样做。

这是我当前的代码:

我在 bootstrap.php 上设置了 zend _initRoute、_initLocale 和 _initTranslate,如下所示:

protected function _initRoutes()
{
    $front = Zend_Controller_Front::getInstance();
    $router = $front->getRouter();

    $module = new Zend_Controller_Router_Route_Module(
        array(),
        $front->getDispatcher(),
        $front->getRequest()
    );

    $language = new Zend_Controller_Router_Route(
        ':lang',
        array(
            'lang' => 'es'
        )
    );

    /**
      * I didn't chain this route cause doesn't work as I expected, 
      * but this is how I want to be able to navigate.
      *
      **/
    $default = new Zend_Controller_Router_Route(
        ':controller/:action/*', 
        array(
            'lang' => 'es',
            'module' => 'default',
            'controller' => 'index',
            'action' => 'index'
        )
    );

    $chainRoute = new Zend_Controller_Router_Route_Chain();
    $chainRoute->chain($language)
               ->chain($module);

    $router->addRoute('default', $chainRoute);

    return $router;
}

/**
 * 
 * Default locale: es_AR
 */
protected function _initLocale()
{
    $local = new Zend_Locale();
    $local->setDefault('es_AR');
    Zend_Registry::set('Zend_Locale', $local);
}

/**
 * 
 * Inisializacion de los lenguages y el Locale por default
 */
protected function _initTranslate()
{
    $translate = new Zend_Translate(
        'Array', 
        APPLICATION_PATH . "/langs/",
        null, 
        array(
            'scan' => Zend_Translate::LOCALE_DIRECTORY
        )
    );

    Zend_Registry::set('Zend_Translate', $translate);
    $translate->setLocale(Zend_Registry::get('Zend_Locale'));
}

我还注册了下一个语言插件:

class MyApp_Controller_Plugin_Language extends Zend_Controller_Plugin_Abstract
{

public function routeShutdown(Zend_Controller_Request_Abstract $request)
{
    $lang = $request->getParam('lang', null);

    $locale = Zend_Registry::get('Zend_Locale');
    $translate = Zend_Registry::get('Zend_Translate');

    if ($translate->isAvailable($lang)) {
        $translate->setLocale($lang);
        $locale->setLocale($lang);
    } else {
        //throw new Zend_Controler_Router_Exception('Translation language is not available', 404);
        $lang = $locale->getLanguage();
        $locale->setLocale($lang);
        $translate->setLocale($lang);
    }

    $front = Zend_Controller_Front::getInstance();
    $router = $front->getRouter();
    $router->setParam('lang', $lang);
}

}

此外,我还创建了自己的 Url 助手,它由使用“Language_Action_Helper”的 zend url 助手扩展:

class Zend_View_Helper_MyUrl extends Zend_View_Helper_Url 
{

protected function _getCurrentLanguage()
{

    return Zend_Controller_Action_HelperBroker::getStaticHelper('Language')
        ->getCurrent();

}

public function myUrl($urlOptions = array(), $name = null, $reset = true, $encode = true)
{
    $urlOptions = array_merge(
        array(
            "lang" => $this->_getCurrentLanguage()
        ),
        $urlOptions
    );

    return parent::url($urlOptions, $name, $reset, $encode);
}

}

然后我创建了一个使用我的 url Helper 的 Anchor 助手:

class Zend_View_Helper_Anchor extends Zend_View_Helper_Abstract
{

public function anchor
(
    $anchorText,
    $controller,
    $action,
    Array $params = array()
)
{
    $front = Zend_Controller_Front::getInstance();

    $defaultUrl = array(
        'module'     => $front->getRequest()->getModuleName(),
        'controller' => $controller,
        'action'     => $action
    );

    if (!empty($params)) {
        foreach ($params as $param => $value) {
            $defaultUrl[$param] = $value;
        }
    }
    // using my url helper
    $url = $this->view->myUrl(
        $defaultUrl,
        null,
        true
    );

    $anchor =<<<HTML
    <a href="{$url}">{$anchorText}</a>
    HTML;

    return $anchor;

}

}

这是语言操作助手,用于在我的 url 助手使用的控制器中提供语言。

class Controller_Helper_Language extends Zend_Controller_Action_Helper_Abstract 
{

/**
 * 
 * Get Current language
 * 
 * @return mixed string|null
 */
public function getCurrent(){

    if (!Zend_Registry::isRegistered("Zend_Locale"))
        return null;

    return Zend_Registry::get("Zend_Locale")->getLanguage();

}

/** 
 * 
 * Get translator 
 * 
 * @return mixed Zend_Translate|null
 * 
 */
public function getTranslator(){

    if (!Zend_Registry::isRegistered("Zend_Translate"))
        return null;

    return Zend_Registry::get("Zend_Translate");

}

}

我的最终方法是使用这种结构,能够设置标准路线,例如:

http://mydomain/forum/:id
http://mydomain/topic/:id
http://mydomain/section/:id
http://mydomain/user/:user

有语言支持。

必须如何配置这些路线以满足我的需求?,我的意思是,我试图做类似的事情:

// what may I do here? How do I chain this route with my language router
$topicRoute = new Zend_Controller_Router_Route(
    'topic/:id',
    array(
        'module' => 'default',
        'controller' => 'forum',
        'action' => 'topic',
        'id' => ':id'
    ),
    array(
        'id' => '^[0-9]$'
    )
)

这个路由器配置也给我的导航配置带来了一些问题。当我设置这个路由器,然后导航到 /topic/id 时,当我悬停由 navigation.xml 给出的任何链接时,总是返回这个配置给出的相同 URI。

http://mydomain/topic/id 

有没有人熟悉这个?,这可能吗?有什么不同的方法来做这样的事情吗?我尝试了一些不同的事情,让我更接近我的目标,但这是我能做到的最接近的......

谢谢。

4

1 回答 1

-1

更好更干净的方法是使用主机名(例如子域)zend 路由,看看下面

http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.hostname

这种方法更简单,对 SEO 也很友好。

于 2012-08-20T17:43:50.773 回答