1

私はついに多言語のCakePHP2.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');
    }
}

AppController.phpでコメントConfigure::write('Config.language', 'fre');を外すと、サイト全体がフランス語になります(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));?>

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

}

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

4

3 に答える 3

1

フラグのHTML出力を教えてください。

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

編集:私はあなたのルートで、あなたが持っている別の説明があります:

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

言語コードは3文字を使用するため、次を使用する必要があります。

'language' => '[a-z]{3}'
于 2012-04-12T22:06:49.197 に答える
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 に答える
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 に答える