2012-04-12 12 views
1

私は多言語CakePHP 2.1アプリを最終的にはにして、を動作させました。CakePHP 2.1 URL言語パラメータ

まず、私は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));?> 

私はURLの切り替えを処理するためにAppHelperでこれを持っているが、それは働いていません。 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); 
    } 

} 

フラグをクリックしても何も起こりません。私は何が欠けていますか?

答えて

1

私は終わりました私のAppControllerに関数を追加し、それを呼び出すbeforeFilter()

私のbeforeFilter()は次のようになります:01

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

} 

ユーザーが言語のアイコンボタンをクリックすると、個々のページが翻訳されています。ここでは

public function beforeFilter() { 
    parent::beforeFilter(); 
    $this->_checkRoute(); 
    $this->Auth->allow('index','view','home','display','logout'); 
} 
_checkRoute()機能です。残っている唯一の問題は、URLパラメータが維持されていないため、ユーザーがメニューリンクをクリックしたときにセッションがセッ別の日のもう一つのパズル。

1

フラグのHTML出力を教えてもらえますか?

あなたのAppHelperのurlメソッドの問題だと思います。あなたが何かをエコーし​​ようとすると、それは表示されますか?

編集:私は、あなたのルートでは、あなたは別の説明がありました:言語コードの使用3つの文字として

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

、あなたが使用する必要があります。

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

を使用する場合

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

前に書き込む必要がありが助けたこと、ありがとうございます! 'fre'は現在どこにロードされていますが、freを言語パラメータとして見る代わりにFreControllerをチェックしています。 – deewilcox

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

私は質問のようにルーティングを使用しましたが、カスタムルーティングも使用しています。カスタムルーティングを使用すると、

$this->Html->link() 
関連する問題