【问题标题】:CakePHP multilingual static pagesCakePHP 多语言静态页面
【发布时间】:2013-12-09 14:31:25
【问题描述】:

我在 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')));

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

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;

【问题讨论】:

    标签: php cakephp localization cakephp-2.4 cakephp-routing


    【解决方案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'));
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2022-11-24
          • 2016-10-19
          • 2011-10-24
          • 1970-01-01
          • 2017-07-23
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多