2013-12-09 1 views
0

Я создал многоязычное приложение в CakePHP 2 Я хочу включить некоторый статический контент на разных языках, и у меня возникли проблемы с настройкой маршрутизации.Многоязычные статические страницы CakePHP

У меня он работает для language/controller/action маршрутов типа, но если я хочу, чтобы иметь статический контент, как я маршрутизировать PagesController с видом на View/Pages/membership.ctp для языка по умолчанию английский и View/fr/Pages/abonnement.ctp для французского перевода, так что URL будет просто/членство или/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; 

ответ

1

Вот что я добавил, чтобы это заработало ...

Controller/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; 
    } 
    ... 
} 

Config/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')); 

Который сейчас работает нормально, как У меня ограниченное количество статических страниц, и мне нужно поддерживать только два языка. Я уверен, что вручную настраивать маршруты для каждого языка, а статическая страница станет слишком громоздкой после приличного количества страниц. Дайте мне знать, если вы думаете о лучшем решении.

0

Может быть проще просто используйте CakePHP Themes и «Тема» для каждого языка. Затем просто установите тему всякий раз, когда вы находитесь в месте, где вы знаете, что вам нужно использовать статический файл, специфичный для языка.

0

У меня есть аналогичная установка. Это может быть ваша функция отображения в PagesController:

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

Это будет отображаться в структуре папок вы смотрите вперед, чтобы иметь.