Поскольку Zend_Navigation_Page_Mvc проверяет только модуль, контроллер и действие, похоже, что он никогда не перейдет к дополнительному элементу маршрутизации.
Одним из решений может быть использование нового класса, такого как: Zend_Navigation_Page_Mvcl, который будет обрабатывать язык.
Но это кажется немного сложным, поэтому я нашел одно решение, используя более крупную навигацию, которая включает все страницы на всех языках.
Это мой xml конфиг для навигации по 2 страницам "home", "test" на французском и английском:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<nav>
<fr>
<label>menu.home</label>
<params>
<lang>fr</lang>
</params>
<action>index</action>
<controller>homepage</controller>
<route>langcontrolleraction</route>
<pages>
<home>
<label>menu.home</label>
<params>
<lang>fr</lang>
</params>
<action>index</action>
<controller>homepage</controller>
<route>langcontrolleraction</route>
</home>
<test>
<label>menu.wallet</label>
<params>
<lang>fr</lang>
</params>
<action>index</action>
<controller>wallet</controller>
<route>langcontrolleraction</route>
</test>
</pages>
</fr>
<en>
<label>menu.home</label>
<params>
<lang>en</lang>
</params>
<action>index</action>
<controller>homepage</controller>
<route>langcontrolleraction</route>
<pages>
<home>
<label>menu.home</label>
<params>
<lang>en</lang>
</params>
<action>index</action>
<controller>homepage</controller>
<route>langcontrolleraction</route>
</home>
<test>
<label>menu.wallet</label>
<params>
<lang>en</lang>
</params>
<action>index</action>
<controller>wallet</controller>
<route>langcontrolleraction</route>
</test>
</pages>
</en>
</nav>
</config>
Как видите, он довольно длинный, всего для 2 страниц.
На самом деле у вас будет (страниц + 1) x языков в навигации
Я использовал «трюк»: домашняя страница присутствует дважды.
- один раз как пункт главного меню
- один раз как первый пункт подменю
Идея состоит в том, чтобы определить, какое подменю будет отображаться на основе выбранного языка, и это автоматически выполняется через маршрутизатор, поэтому все, что вам нужно сделать, это указать приложению нарисовать подменю вместо меню. Итак, вот строка, которую я использую для этого в моем файле макета :
<?php
echo $this->navigation()->menu()->renderSubMenu()
?>
Я не видел, как вы добавили Zend_Navigation , так что вот мой от Bootstrap.php :
<?php
protected function _initNavigation() {
$config = new Zend_Config_Xml(Zend_Registry::get ( 'config' )
->resources->navigation->file, 'nav');
$navigationContainer = new Zend_Navigation($config);
// Store the container in the proxy helper:
$view = $this->getResource ( 'view' );
$view->getHelper('navigation')->setContainer($navigationContainer);
}
?>
Кстати, в том же Bootstrap.php Я могу оставить язык по умолчанию 'en', вот мой _initRoutes () :
<?php
protected function _initRoutes() {
$router = Zend_Controller_Front::getInstance ()->getRouter ();
$router->removeDefaultRoutes ();
$myRoute = new Zend_Controller_Router_Route (
':lang/:controller/:action',
array (
'lang' => 'en',
'controller' => 'index',
'action' => 'index',
)
);
$router->addRoute ( 'langcontrolleraction', $myRoute );
}
?>
И для перевода это делается автоматически, если вы зарегистрировали свой Zend_Translate. В моем примере: menu.home выдаст:
- Home на английском
- Accueil на французском
Надеюсь, это поможет.
Я бы предпочел другое, более тонкое решение, но пока не нашел.