2014-02-27 79 views
1

我正在阅读有关路由的CakePHP文档,但是我还无法掌握它。语言和路由

我想实现的是:

  • 应该有和没有在控制器参数的前一个语言参数工作。
  • 当没有给出动作时,它应该转到前端动作(该函数也有输入变量)。

编辑

最后,我做我的应用程序逻辑,如果有定义的只有1种语言,不会有lanugage前缀,如果有更多的语言,链接将被生成语言前缀(通过覆盖html助手)和路由将是不同的。否则,当我试图定义单一语言版本的路由(没有前缀)时总会有问题。这里是我的代码,现在的工作:

(应用程序/配置/ routes.php文件)

/* 
* ===================== Input start ===================== * 
*/ 

/** 
* Default language 
*/ 
    Configure :: write('Config.language', 'mkd'); 

/** 
* Application languages 
*/ 
    Configure :: write('Config.languages', array(
     'mkd' => 'Македонски', 
     'eng' => 'English', 
    )); 

/** 
* ====================== Input end ====================== * 
*/ 



/** 
* Counting languages... 
*/ 

Configure :: write('Config.languageCount', count(Configure :: read('Config.languages'))); 

/** 
* If application is multilingual 
*/ 
    if(Configure :: read('Config.languageCount') > 1) { 
     Router::connect('/:language/:controller/:action/*', 
      array(), 
      array('language' => implode('|', array_keys(Configure :: read('Config.languages')))) 
     ); 
     Router::connect('/:language/:controller/*', 
      array('action' => 'frontend'), 
      array('language' => implode('|', array_keys(Configure :: read('Config.languages')))) 
     ); 
    } 
/** 
* If application has one language 
*/ 
    else { 
     Router::connect('/:controller/*', array('action' => 'frontend')); 
    } 

感谢您的帮助戴夫和kicaj,你的帮助简化我的这种方法。

+1

阅读:http://bakery.cakephp.org/articles/kicaj/2013/01/27/internationalization_with_static_and_dynamic_content_routing_and_switching – kicaj

+0

我找不到任何有关语言插件路由的问题 –

回答

2

你可能会希望使用正则表达式来代替 - 这样的事情:

Router::connect(
    '/:language/:controller/:action/*', 
    array(), 
    array('language'=>'[a-z]{3}' 
)); 

注意第三个参数,它给出了一个名字和一个正则表达式规则:language

然后,它会在你的控制器使用(你很可能会在你的AppController的beforeFilter()使用)有:

$this->request->params['language'] 
+0

我编辑了我的问题。我有一切工作,但我有一个路由我的插件视图的问题。 –

+0

这将是一个新问题,因为您之前的问题与插件无关。 – Dave

+0

是的,后来我想到了,当我访问一个插件时,语言不会在url中作为前缀,而是作为最终的参数。它现在起作用,我再次编辑我的问题。谢谢。 –