我想强制我网站的网址始终有一个语言后缀。
因此,如果他们输入www.mysite.com
,则应将其转到www.mysite.com/en
。
我有一种默认语言,因此如果是第一次访问该网站,则应该使用该语言。如果不是,我设置了一个可以使用的Cookie ...但是 - 我不知道在哪里使用它。
我考虑过检查网址中是否有“语言”参数,如果没有,重定向,但是 - 这似乎有点过分 - 是否有更好的方法?我可以在路线上这样做吗?或引导?
答案 0 :(得分:1)
最有效的方法是通过您的网络服务器。您可以轻松检查请求是否适用于/
(主页)并重定向到/en
。
检查您使用的Web服务器的文档,它们都有类似mod_rewrite
或类似的内容。
修改强>
您可以设置/set_default_language
之类的路由,以便在/
的情况下重定向到该路由器,此控制器可以访问数据库并执行所需的操作。
或者,您可以在没有指定语言的情况下将其重定向到/your/usual/language_switch
,并允许代码使用默认值。
答案 1 :(得分:0)
我做了什么:
我最终检查了AppController的beforeFilter()是否设置了$this->request->params['langauge']
,如果没有,则相应地构建URL:
//Redirect to same url, but with language parameter
if (empty($this->request->params['language']) &&
empty($this->request->params['admin'])) {
$defaultLanguageCode = Configure::read('Languages.default.code2');
$cookiedLanguage = $this->Language->activeLanguageByCode($this->Cookie->read('lang'));
$languageToRedirectTo = (!empty($cookiedLanguage['code2'])) ? cookiedLanguage['code2'] : $defaultLanguageCode;
$newURL = '/' . $languageToRedirectTo . $this->request->here;
$this->redirect($newURL);
}
注意:强>
我无法弄清楚的部分(直到在IRC中获得帮助)是使用$this->request->here
构建URL,这只是URL作为字符串。在此之前,我尝试使用params数组构建数组,但没有运气。
我的路线(如果他们帮助任何人)
(请记住,我是路线菜鸟,所以 - 虽然他们似乎在为我工作,但我不保证他们做得好!)
//root URL and root URL w/ language
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home')); // eg: www.google.com takes them to pages/display/home
Router::connect('/:language', array('controller'=>'pages', 'action' => 'display', 'home'), array('language'=>'[a-z]{2}')); // eg: /en takes them to pages/display/home and sets language
//pages (eg. /en/r/the_matrix or /r/the_matrix)
Router::connect('/:language/r/:slug/*', array('controller'=>'pages', 'action'=>'display'), array('language'=>'[a-z]{2}', 'pass'=>array('slug')));
Router::connect('/r/:slug/*', array('controller'=>'pages', 'action'=>'display'), array('pass'=>array('slug')));
//adds language to default URL
Router::connect('/:language/:controller/:action/*', array(), array('language'=>'[a-z]{2}'));
//Route prefixes
Configure::write('Routing.prefixes', array('admin'));
//User related
Router::connect('/login', array('controller' => 'users', 'action' => 'login'));
Router::connect('/logout', array('controller' => 'users', 'action' => 'logout'));
Router::connect('/myaccount', array('controller' => 'users', 'action' => 'my_account'));
//
CakePlugin::routes();
require CAKE . 'Config' . DS . 'routes.php';
答案 2 :(得分:0)
如果您不想从控制器或视图中重定向requestAction调用,则应将以下条件添加到IF语句
if (empty($this->request->params['language']) &&
empty($this->request->params['admin']) &&
empty($this->request->params['requested'])) {
...
}