【问题标题】:Zend_Controller_Router: Get language from translated segmentZend_Controller_Router:从翻译段中获取语言
【发布时间】:2011-01-14 12:50:24
【问题描述】:

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

/:@controller/:@action/

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

/user/profile/

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

/kullanici/profil/

然后我可以理解请求的语言是土耳其语。 Zend_Controller_Router 如何做到这一点?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 在 URL 上使用英文单词作为 SEO 技术的完全土耳其页面并不是一件好事。并且在英文页面上也使用土耳其语......在我们的路由器配置中,Zend 框架已经从这种类型的翻译段中获取了请求的控制器。唯一的问题是,在获取当前控制器时,我无法获得使用的翻译。如果我为每种语言使用多条路由,我的 url 管理会很丑,我不能简单地生成动态 url 等等。如果可能的话,我想为所有语言使用一个规则。
    • @Murat:“唯一的问题是,在获取当前控制器时,我无法获得使用的翻译。”对不起,你能在这里更详细一点吗?看起来如果 ZF 正在按照您所说的方式工作,那么 locale 应该可以在应用程序堆栈中的某处(如请求或引导程序中)可用。翻译目前在哪里进行?
    【解决方案2】:

    我们通过创建一个扩展 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");
           }    
        }    
      }    
    }    
    .....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      相关资源
      最近更新 更多