2014-02-27 118 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中作爲前綴,而是作爲最終的參數。它現在起作用,我再次編輯我的問題。謝謝。 –