4

Yii フレームワークで「国際化 (i18n)」と「動的 URL 管理」を実装するためのより良い方法を知りたいです。

(保守が難しい) 一時的な解決策:

// protected/config/main.php
'language' => 'es',
...
'urlManager'=>array(
        'urlFormat'=>'path',
        'showScriptName' => false,
        'rules'=>array(
            // pages
            'es/turismo/<slug:>' => array('visit/page', 'defaultParams' => array('lang' => 'es'), 'urlSuffix' => '.html'),
            'it/visita/<slug:>' => array('visit/page', 'defaultParams' => array('lang' => 'it'), 'urlSuffix' => '.html'),
            'en/travel/<slug:>' => array('visit/page', 'defaultParams' => array('lang' => 'en'), 'urlSuffix' => '.html'),
            'turismo/<slug:>' => array('visit/page', 'urlSuffix' => '.html'),

            // home
            'es/turismo' => array('visit/index', 'defaultParams' => array('lang' => 'es'), 'urlSuffix' => '.html'),
            'it/visita' => array('visit/index', 'defaultParams' => array('lang' => 'it'), 'urlSuffix' => '.html'),
            'en/travel' => array('visit/index', 'defaultParams' => array('lang' => 'en'), 'urlSuffix' => '.html'),

            // contact us
            'es/contactenos' => array('site/contact', 'defaultParams' => array('lang' => 'es'), 'urlSuffix' => '.html'),
            'it/contattaci' => array('site/contact', 'defaultParams' => array('lang' => 'it'), 'urlSuffix' => '.html'),
            'en/contact-us' => array('site/contact', 'defaultParams' => array('lang' => 'en'), 'urlSuffix' => '.html'),

        ),
    ),
...


// protected/controllers/VisitController.php
...
public function actionIndex($lang = 'es'){
    Yii::app()->language = $lang;
    ...
}
public function actionPage($slug, $lang = 'es'){
    Yii::app()->language = $lang;
    ...
}
...

これは、各コントローラーの新しい構成 'urlManager' ルールを意味し、常に各コントローラー アクションに $lang パラメーターを渡します。実際の例:

montmartrebutte.com

私は成功せずにいくつかの他のオプションを試しました:

Yii Framework フォーラム: 動的 URL マネージャーのルート

ありがとう!

4

1 に答える 1

3

ルール:

'<lang:(es|it|en)>/(turismo|visita|travel)/<slug:>' => array('visit/page', 'urlSuffix' => '.html'),

コントローラ:

class VisitController extends Controller
{
    public function actionPage($slug)
    {

    }
}

親コントローラー (モジュールを使用しない場合):

class Controller extends CController
{
    public function beforeAction($action)
    {
        Yii::app()->language = Yii::app()->request->getQuery('lang', 'es');
        return parent::beforeAction($action);
    }
}
于 2012-08-08T08:51:12.200 に答える