lav45/yii2-translated-behavior

这个扩展可以使您快速且简单地为任何ActiveRecord模型添加翻译。

安装次数: 40,343

依赖: 1

建议者: 0

安全: 0

星标: 37

关注者: 9

分支: 7

类型:yii2-extension

1.4.4 2017-11-07 21:36 UTC

README

Latest Stable Version License Total Downloads Build Status Test Coverage Scrutinizer Code Quality Code Climate

翻译行为是ActiveRecord模型的Yii2扩展,可以帮助您添加实体转换的可能性。

您可以在DEMO中查看

安装

建议通过composer安装此扩展。

您可以通过设置控制台

$ composer require "lav45/yii2-translated-behavior:1.4.*"

或在composer.json文件的require部分添加

"lav45/yii2-translated-behavior": "1.4.*"

设置

首先,您需要将所有需要翻译的属性移动到单独的表中。例如,假设我们想要保存帖子的标题和描述的翻译。您的表结构应调整为以下形式

    +--------------+        +--------------+       +-------------------+
    |     post     |        |     post     |       |     post_lang     |
    +--------------+        +--------------+       +-------------------+
    | id           |        | id           |       | post_id           |
    | title        |  --->  | created_at   |   +   | lang_id           |
    | description  |        | updated_at   |       | title             |
    | updated_at   |        +--------------+       | description       |
    | created_at   |                               +-------------------+
    +--------------+

在更改表结构后,我们现在需要确定我们的ActiveRecord对象的比例并添加行为

帖子

use yii\db\ActiveRecord;
use lav45\translate\TranslatedTrait;
use lav45\translate\TranslatedBehavior;

/**
 * ...
 * @property string $title
 * @property string $description
 */
class Post extends ActiveRecord
{
    use TranslatedTrait;

    public function rules()
    {
        return [
            // ...

            [['title'], 'required'],
            [['title'], 'string', 'max' => 128],

            [['description'], 'required'],
            [['description'], 'string'],
        ];
    }
    
    public function behaviors()
    {
        return [
            [
                'class' => TranslatedBehavior::className(),
                'translateRelation' => 'postLangs', // Specify the name of the connection that will store transfers
//                'languageAttribute' => 'lang_id' // post_lang field from the table that will store the target language
                'translateAttributes' => [
                    'title',
                    'description',
                ]
            ]
        ];
    }

    public function attributeLabels()
    {
        return [
            // ...
            'title' => 'Title',
            'description' => 'Description',
        ];
    }

    public function getPostLangs()
    {
        return $this->hasMany(PostLang::className(), ['post_id' => 'id']);
    }
}

语言模型

migrate

migrate/m151220_112320_lang.php

使用控制台命令应用

~$ yii migrate/up --migrationPath=vendor/lav45/yii2-translated-behavior/migrate

Lang ActiveRecord模型引用完整

\lav45\translate\models\Lang

使用

后端

backend/config/bootstrap.php

Yii::$container->set('lav45\translate\TranslatedBehavior', [
    'language' => isset($_GET['lang_id']) ? $_GET['lang_id'] : null
]);

backend/controllers/PostController.php

namespace backend\controllers;

use yii\web\Controller;
use yii\data\ActiveDataProvider;

use common\models\Post;
use common\models\Lang;

class PostController extends Controller
{
    public function actionIndex()
    {
        $dataProvider = new ActiveDataProvider([
            'query' => Post::find()
                ->with([
                    'currentTranslate', // loadabing data associated with the current translation
                    'hasTranslate' // need to display the status was translated page
                ]),
        ]);

        return $this->render('index', [
            'dataProvider' => $dataProvider,
            'langList' => Lang::getList(),
        ]);
    }
// ...
}

backend/view/post/index.php

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'columns' => [
            [
                'class' => 'lav45\translate\grid\ActionColumn',
                'languages' => $langList,
            ],
            [
                'class' => 'yii\grid\ActionColumn',
                'template' => '{delete}'
            ],
        ],
    ]);
    ?>

结果,在创建新页面后,将获得一些按钮以在不同语言中编辑内容

Translate button

因此,您可以获取当前模型的语言

/**
 * @var $this yii\web\View
 * @var $model common\models\Page
 */

$this->title = 'Create Post ( ' . $model->language . ' )';

前端

frontend/config/main.php

use lav45\translate\models\Lang;

return [
    'components' => [
        'urlManager' => [
            'class' => 'lav45\translate\web\UrlManager',
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                [
                    'class' => 'yii\web\UrlRule', // If there is no need to substitute the language, you can use the base class
                    'pattern' => '',
                    'route' => 'post/index',
                ],
                [
                    'pattern' => '<_lang:' . Lang::PATTERN . '>/<id:\d+>',
                    'route' => 'post/view',
                ],
                [
                    'pattern' => '<_lang:' . Lang::PATTERN . '>',
                    'route' => 'post/index',
                ]
            ],
        ],
    ],
];

frontend/controllers/PostController.php

namespace frontend\controllers;

use yii\web\Controller;
use common\models\Post;
use lav45\translate\models\Lang;

class PostController extends Controller
{
    public function behaviors()
    {
        return [
            [
              // ContentNegotiator will be determined from a URL or browser language settings and install it in
              // Yii::$app->language, which uses the class TranslatedBehavior as language translation
                'class' => 'yii\filters\ContentNegotiator',
                'languages' => Lang::getLocaleList()
            ],
        ];
    }

或者您可以为所有控制器添加,为此您需要在frontend/config/bootstrap.php中添加

\yii\base\Event::on('yii\base\Controller', 'beforeAction', function($event) {
    /** @var yii\filters\ContentNegotiator $negotiator */
    $negotiator = Yii::createObject([
        'class' => 'yii\filters\ContentNegotiator',
        'languages' => \common\models\Lang::getLocaleList(),
    ]);
    /** @var yii\base\ActionEvent $event */
    $negotiator->attach($event->action);
    $negotiator->negotiate();
});

许可证

yii2-translated-behavior 在BSD 3-Clause许可证下可用。详细信息可在LICENSE.md中找到。