CakePHP 2.1 URL语言参数

时间:2012-04-12 21:56:54

标签: url cakephp internationalization

我终于让我的多语言CakePHP 2.1应用程序几乎正常工作。

首先,我在core.php

的末尾定义默认语言
/* Define default language */
Configure::write('Config.language', 'eng');

以下是AppControler.php中的代码:

public function beforeFilter() {
parent::beforeFilter();
    $this->_setLanguage();
    //Configure::write('Config.language', 'fre'); //Manually change the language to test .po file
    $this->Auth->allow('index','view','home','display','logout');
}

function _setLanguage() {

    if ($this->Cookie->read('lang') && !$this->Session->check('Config.language')) {
        $this->Session->write('Config.language', $this->Cookie->read('lang'));
    }
    else if (isset($this->params['language']) && ($this->params['language']
             !=  $this->Session->read('Config.language'))) {

        $this->Session->write('Config.language', $this->params['language']);
        $this->Cookie->write('lang', $this->params['language'], false, '20 days');
    }
}

如果我在AppController.php中取消注释Configure::write('Config.language', 'fre');,则整个站点都是法语(除了数据库驱动的内容,我计划使用TranslateBehavior)。但是,我想在按钮点击时使用基于URL的语言切换,这就是应用程序崩溃的地方。这是我的路线,基于此nuts-and-bolts tutorial

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

这是我的按钮代码:

<?php echo $this->Html->link($this->Html->image('../img/PUZ013-US-Flag.png', array('border' => '0')),array('language'=>'eng'),array('target' => '_parent', 'escape' => false));;?>&nbsp <?php echo $this->Html->link($this->Html->image('../img/PUZ013-FR-Flag.png', array('border' => '0')),array('language'=>'fre'),array('target' => '_parent', 'escape' => false));?>

我在AppHelper中有这个来处理URL切换,但它没有用。该URL应为example.com/fre/controller/action,而是example.com/controller/action/language:fre,并且cookie不会更改。

class AppHelper extends Helper {

  public function url($url = null, $full = false) {
        if(!isset($url['language']) && isset($this->params['language'])) {
          $url['language'] = $this->params['language'];
        }

        return parent::url($url, $full);
   }

}

如果点击标志,则没有任何反应。我错过了什么?

3 个答案:

答案 0 :(得分:1)

你能告诉我们标志的HTML输出吗?

我认为你的AppHelper中的url方法存在问题。如果你试图在其中回应一些东西,它会显示出来吗?

编辑:我还有另一种解释,在您的路线中,您有:

'language' => '[a-z]{2}'

由于您的语言代码使用3个字符,您应该使用:

'language' => '[a-z]{3}'

答案 1 :(得分:1)

我最终在我的AppController中添加了一个函数并在我的beforeFilter()中调用它:

我的beforeFilter()看起来像这样:

public function beforeFilter() {
    parent::beforeFilter();
    $this->_checkRoute();
    $this->Auth->allow('index','view','home','display','logout');
}

以下是_checkRoute()功能:

function _checkRoute() {
        $params = $this->params['pass'];
        $url = $this->here;

        if (strpos($url, 'language:fre')) {
            $this->Session->write('Config.language', 'fre'); 
            Configure::write('Config.language', 'fre');
        }

        elseif (strpos($url, 'language:eng')) {
            Configure::write('Config.language', 'eng');
            $this->Session->write('Config.language', 'eng');
        }

}

当用户单击语言图标按钮时,将翻译单个页面。唯一剩下的问题是当用户点击菜单链接时会话取消设置,因为不保留URL参数。另一天的另一个难题。

答案 2 :(得分:0)

以防其他人堕落这个问题。我所做的是使用上面的deewilcox的答案并稍微更改了代码。

function _checkRoute() {
    $lang = $this->params["language"];


    if ($lang != $this->Session->read("Config.language")) {
        $this->Session->write('Config.language', "".$lang);
        Configure::write('Config.language', "".$lang);
    }
}

我在问题中使用了路由,但我也使用自定义路由。必须在

之前编写自定义路由
Router::connect('/:language/:controller/:action/*', array(), array('language' => '[a-z]{3}')); 

如果您使用

$this->Html->link()
相关问题