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

问题描述 投票:0回答:2

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

/:@controller/:@action/

所以我想在路线上使用翻译后的细分,并且希望从这些翻译后的细分中检测所请求的语言。例如,如果用户请求这样的网址:

/user/profile/

然后,我可以理解要求的语言是英语。如果用户请求这样的网址:

/kullanici/profil/

然后我很明白,要求的语言是土耳其语。如何使用Zend_Controller_Router做到这一点?

zend-framework localization url-rewriting url-routing zend-controller-router
2个回答
0
投票

我不知道这是一个好主意。因为要做到这一点,您首先必须确定至少一个路段的语言。为了做到这一点,您要么必须预先知道映射(即,它与纵断面路线匹配,所以它是英语还是土耳其语?),或者您需要针对土耳其语/英语路线分段的字典扫描路线分段。前者将要求您为每条路线进行2条路线-一条为土耳其语,一条为英语,而后者则要求您在实际匹配广告的时间之外,还需要在请求处理时间上支付罚款。路线。 IMO最好坚持使用典型的:lang/:controller/:action类型的路由构造。

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


0
投票

我们通过扩展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");
       }    
    }    
  }    
}    
.....
© www.soinside.com 2019 - 2024. All rights reserved.