1

我终于让我的多语言 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');
    }
}

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

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);
   }

}

如果您单击标志,则不会发生任何事情。我错过了什么?

4

3 回答 3

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 参数未维护。另一天的另一个谜题。

于 2012-04-13T19:45:54.747 回答
1

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

我认为这是您在 AppHelper 中的 url 方法的问题。如果您尝试在其中呼应某些内容,它会显示吗?

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

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

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

'language' => '[a-z]{3}'
于 2012-04-12T22:06:49.197 回答
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()
于 2014-06-17T10:24:55.530 回答