代码之家  ›  专栏  ›  技术社区  ›  Murat Çorlu beardofprey

Zend_控制器_路由器:从翻译段获取语言

  •  0
  • Murat Çorlu beardofprey  · 技术社区  · 14 年前

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

    /:@controller/:@action/
    

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

    /user/profile/
    

    然后我就可以理解所要求的语言是英语。如果用户请求这样的URL:

    /kullanici/profil/
    

    然后我就明白了要求的语言是土耳其语。我如何使用Zend_控制器_路由器?

    2 回复  |  直到 14 年前
        1
  •  0
  •   prodigitalson    14 年前

    我不知道这是不是个好主意。因为要做到这一点,首先必须确定至少一个路由段的语言。为了做到这一点,你要么要知道前面的地图(也就是说,这与配置文件的路线相匹配,所以它是英语还是tukish?)或者,您需要根据土耳其语/英语路由段字典扫描路由段。前者要求您为每一条路线制作两条路线-一条是土耳其语,一条是英语,后者要求您在请求处理时间内支付罚金,而不是实际匹配路线所需的时间。在我看来,最好还是坚持 :lang/:controller/:action 路线构造的类型。

    也就是说,如果您打算这样做,我将创建一个新的路由类型来处理将URI与语言匹配的问题。然后,这将为您设置一个I18N语言参数,但它还应该将URI重置为一个特定的basline语言,您将实际匹配标准路由。然后我会用 Zend_Controller_Router_Route_Chain 把两个连在一起。

        2
  •  0
  •   Murat Çorlu beardofprey    14 年前

    我们通过扩展Zend_控制器_路由器_路由创建了一个新的路由器来解决我们的问题。我们重写了类的“match”方法,并在原始匹配代码中添加了一些代码行。

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