0

我在 CakePHP 2 中创建了一个多语言应用程序,我想包含一些不同语言的静态内容,但在设置路由时遇到了麻烦。

我让它适用于language/controller/action类型路由,但如果我想拥有静态内容,如何将 PagesController 路由到View/Pages/membership.ctp默认语言英语和View/fr/Pages/abonnement.ctp法语翻译的视图,以便 url 只是 /membership 或 /fr/abonnement?将翻译相互关联以使语言切换链接正常工作并且反向路由正常工作的最佳方式是什么?

我已经有以下路线

Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));

Router::connect('/:language',
                   array('controller' => 'pages', 'action' => 'display', 'home'),
                   array('language' => 'en|fr', 'persist'=>array('language')));

Router::connect('/:language/:controller',
                   array('action' => 'index'),
                   array('language' => 'en|fr', 'persist'=>array('language')));

Router::connect('/:language/:controller/:action/*',
                   array(),
                   array('language' => 'en|fr', 'persist'=>array('language')));

_setLanguage()从 AppController 调用的方法beforeFilter()

protected function _setLanguage() {
    //if the cookie was previously set, and Config.language has not been set
    //write the Config.language with the value from the Cookie
    if ($this->Cookie->read('lang') && !$this->Session->check('Config.language')) {
      $this->Session->write('Config.language', $this->Cookie->read('lang'));
    }
    //if the user clicked the language URL
    else if ( isset($this->params['language']) && ($this->params['language'] !=  $this->Session->read('Config.language'))) {
        // get the correct language code
        $languageCodeEquivalencies = array(
            'fr'=>'fra',
            'en'=>'eng'
        );
        $languageCode = $this->params['language'];
        if(in_array($languageCode, array_keys($languageCodeEquivalencies))) {
            $languageCode = $languageCodeEquivalencies[$languageCode];
        }
      //then update the value in Session and the one in Cookie
      $this->Session->write('Config.language', $languageCode);
      $this->Cookie->write('lang', $languageCode, false, '20 days');
    }
    //ensure that both I18n and TranslateBehavior access the same language value.
    if ($this->Session->check('Config.language')) {
        Configure::write('Config.language', $this->Session->read('Config.language'));
    }
}

我的语言切换链接看起来像这样

if($this->Session->read('Config.language') == 'fra'):
    echo $this->Html->link('English', array_merge(array('language'=>'en'), $this->passedArgs));
else:
    echo $this->Html->link('Français', array_merge(array('language'=>'fr'), $this->passedArgs));
endif;
4

3 回答 3

1

这是我为使其正常工作而添加的内容...

控制器/AppController.php

public function beforeFilter() {
  ...
  // render language specific view if it exists
  $locale = Configure::read('Config.language');
  if ($locale && file_exists(APP . 'View' . DS . $locale . DS . $this->viewPath)) {
      // e.g. use /app/View/fra/Pages/tos.ctp instead of /app/View/Pages/tos.ctp
      $this->viewPath = $locale . DS . $this->viewPath;
  }
  ...
}

配置/routes.php

Router::connect('/fr/abonnement', array('language'=>'fr', 'controller' => 'pages', 'action' => 'display', 'membership'));
Router::connect('/en/membership', array('language'=>'en', 'controller' => 'pages', 'action' => 'display', 'membership'));

现在工作正常,因为我的静态页面数量有限,我只需要支持两种语言。我很确定手动设置每种语言的路线,静态页面在页面数量相当多之后会变得过于笨拙。如果您想到更好的解决方案,请告诉我。

于 2013-12-11T19:18:56.607 回答
0

使用CakePHP 主题并为每种语言都有一个“主题”可能是最简单的。然后只要在您知道需要使用静态语言特定文件的地方设置主题即可。

于 2013-12-10T00:12:21.643 回答
0

我有类似的设置。这可能是您在 PagesController 中的显示功能:

public function display($page) {
    return $this->render(implode('/', compact($this->request->language, 'page')));
}

这将映射到您期待拥有的文件夹结构。

于 2013-12-10T22:41:13.487 回答