Zend_Controller_Router:从翻译的段中获取语言

时间:2010-02-08 20:08:05

标签: zend-framework localization url-rewriting url-routing zend-controller-router

我想在我的网站上使用网址重写:

/:@controller/:@action/

所以我想在路线上使用已翻译的片段,我想从这些翻译的片段中检测所请求的语言。例如,如果用户请求这样的URL:

/user/profile/

然后我才明白所要求的语言是英语。如果用户请求这样的网址:

/kullanici/profil/

然后我才明白所要求的语言是土耳其语。我怎么能用Zend_Controller_Router做到这一点?

2 个答案:

答案 0 :(得分:0)

我不知道如果那是个好主意。因为为了做到这一点,首先必须确定至少一个路段的语言。为了做到这一点,你要么必须知道前面的映射(即这与配置文件路由匹配,所以它是英文还是tukish?)或者你需要根据土耳其/英文路线段的字典扫描路线段。前者要求你为每条路线制作2条路线 - 一条用土耳其语,一条用英语,而后者则要求你在请求处理时间内支付一笔罚款,而不是实际匹配的时间。路线。 IMO最好坚持使用典型的:lang/:controller/:action类型的路径构造。

那说如果你要这样做我会创建一个新的路由类型来处理URI与语言的匹配。然后,这将为您设置语言参数,但它也应该将URI重置为您将实际匹配标准路线的特定基线语言。然后我会使用Zend_Controller_Router_Route_Chain将两者连在一起。

答案 1 :(得分:0)

我们通过创建一个扩展Zend_Controller_Request_http的新路由器解决了我们的问题。我们覆盖了类的“匹配”方法,并在原始匹配代码中添加了一些代码行。

.....
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");
       }    
    }    
  }    
}    
.....