我想知道是否有人可以帮我解决下一期的问题。
我希望能够使用带有和不带Uri lang标志的多语言支持来设置我的项目,还有模块结构。
我的意思是
http://mydomain/
http://mydomain/forum
http://mydomain/gallery
使用Zend_Locale + Zend_Translate default(en)
在没有lang uri参数的情况下导航还有:
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助手,由zend url helper扩展,使用'Language_Action_Helper':
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);
}
}
然后我创建了一个Anchor助手,它使用了我的url Helper:
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
有人熟悉这个吗?这可能吗?有什么不同的方式做这样的事情?我尝试了一些让我更接近目标的不同东西,但这是我能够接近的......
感谢。
答案 0 :(得分:-1)
更好更清洁的方法是使用主机名(例如子域名)查看路由,看看下面的内容
这种方法也更容易和SEO友好。