0

我想强制我的网站的 URL 总是有一个语言后缀。

因此,如果他们键入www.mysite.com它应该将他们带到www.mysite.com/en.

我有一个默认语言,所以如果这是他们第一次访问该网站,应该使用它。如果不是,我设置了一个可以使用的 Cookie……但是 - 我不知道在哪里使用它。

我考虑过检查 URL 中是否有“语言”参数,如果没有,则进行重定向,但是 - 这似乎有点矫枉过正 - 有没有更好的方法?我可以在路线中这样做吗?或引导?

4

3 回答 3

1

最有效的方法是通过您的网络服务器。您可以轻松检查请求是否针对/(主页)并重定向到/en.

检查文档以了解您使用的任何网络服务器,它们都有类似mod_rewrite或类似的东西。

编辑

你可以设置一个路由,比如/set_default_language在 的情况下重定向到/,这个控制器可以访问数据库并做它需要的任何事情。

或者,您可以将其重定向到/your/usual/language_switch不指定语言并允许代码使用默认值。

于 2012-12-16T01:47:04.457 回答
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 中获得帮助)是使用 构建 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';
于 2012-12-16T02:08:26.830 回答
0

如果您不想从控制器或视图中重定向 requestAction 调用,则应将以下条件添加到 IF 语句

    if (empty($this->request->params['language']) &&
    empty($this->request->params['admin']) && 
    empty($this->request->params['requested'])) {
    ...
    }
于 2014-01-19T23:25:46.760 回答