我想在我的网站上使用 URL 重写:
/:@controller/:@action/
所以我想在路线上使用翻译的段,我想从这些翻译的段中检测请求的语言。例如,如果用户请求这样的 url:
/user/profile/
然后我可以理解所要求的语言是英语。如果用户请求这样的网址:
/kullanici/profil/
然后我可以理解请求的语言是土耳其语。我怎样才能用 Zend_Controller_Router 做到这一点?
我想在我的网站上使用 URL 重写:
/:@controller/:@action/
所以我想在路线上使用翻译的段,我想从这些翻译的段中检测请求的语言。例如,如果用户请求这样的 url:
/user/profile/
然后我可以理解所要求的语言是英语。如果用户请求这样的网址:
/kullanici/profil/
然后我可以理解请求的语言是土耳其语。我怎样才能用 Zend_Controller_Router 做到这一点?
我们通过创建一个扩展 Zend_Controller_Router_Route 的新路由器解决了我们的问题。我们覆盖了类的“匹配”方法,并在原始匹配代码中添加了一些代码行。
.....
foreach( $translateMessages as $key => $val ) {
if (($originalPathPart = array_search($pathPart, $val)) !== false) {
$pathPart = $originalPathPart;
if (!$this->_localeSet) {
$locale = Zend_Registry::get('Zend_Locale');
$locale->setLocale($key); // Set Locale by translated key language
$this->_localeSet = true; // Added to class with default value false
$this->_activeLocale = $key; // Added to class with default value ''
}else{
// A second translated key but this is not same language.
// Then rise 404 error
if ($this->_activeLocale != $key) {
//FIXME: Rise 404 error
throw new Exception("URL Not Found");
}
}
}
}
.....
我不知道这是不是个好主意。因为为了做到这一点,您首先必须确定至少一个路段的语言。为了做到这一点,您要么必须预先知道映射(即,这与配置文件路线相匹配,所以它是英语还是土耳其语?),或者您需要根据土耳其语/英语路线段的字典扫描路线段。前者将要求您为每条路线制作 2 条路线 - 一条用土耳其语,一条用英语,而后者将要求您在实际匹配所需时间的基础上支付请求处理时间的罚款路线。IMO 最好坚持使用典型:lang/:controller/:action
类型的路线构造。
也就是说,如果您要这样做,我将创建一个新的路由类型来处理将 URI 与语言匹配。然后,这将为您设置 i18n 语言参数,但它还应该将 URI 重置为您将实际匹配标准路线的特定基本语言。然后我会使用Zend_Controller_Router_Route_Chain
将两者链接在一起。