我想强制我的网站的 URL 总是有一个语言后缀。
因此,如果他们键入www.mysite.com
它应该将他们带到www.mysite.com/en
.
我有一个默认语言,所以如果这是他们第一次访问该网站,应该使用它。如果不是,我设置了一个可以使用的 Cookie……但是 - 我不知道在哪里使用它。
我考虑过检查 URL 中是否有“语言”参数,如果没有,则进行重定向,但是 - 这似乎有点矫枉过正 - 有没有更好的方法?我可以在路线中这样做吗?或引导?
我想强制我的网站的 URL 总是有一个语言后缀。
因此,如果他们键入www.mysite.com
它应该将他们带到www.mysite.com/en
.
我有一个默认语言,所以如果这是他们第一次访问该网站,应该使用它。如果不是,我设置了一个可以使用的 Cookie……但是 - 我不知道在哪里使用它。
我考虑过检查 URL 中是否有“语言”参数,如果没有,则进行重定向,但是 - 这似乎有点矫枉过正 - 有没有更好的方法?我可以在路线中这样做吗?或引导?
最有效的方法是通过您的网络服务器。您可以轻松检查请求是否针对/
(主页)并重定向到/en
.
检查文档以了解您使用的任何网络服务器,它们都有类似mod_rewrite
或类似的东西。
编辑
你可以设置一个路由,比如/set_default_language
在 的情况下重定向到/
,这个控制器可以访问数据库并做它需要的任何事情。
或者,您可以将其重定向到/your/usual/language_switch
不指定语言并允许代码使用默认值。
我做了什么:
我最终检查了 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 中获得帮助)是使用 构建 URL $this->request->here
,这只是作为字符串的 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';
如果您不想从控制器或视图中重定向 requestAction 调用,则应将以下条件添加到 IF 语句
if (empty($this->request->params['language']) &&
empty($this->request->params['admin']) &&
empty($this->request->params['requested'])) {
...
}