lav45 / yii2-translated-behavior
这个扩展可以使您快速且简单地为任何ActiveRecord模型添加翻译。
1.4.4
2017-11-07 21:36 UTC
Requires
- yiisoft/yii2: dev-master as 2.0.x-dev
Requires (Dev)
- phpunit/dbunit: *
- phpunit/phpunit: 4.* | 5.*
This package is auto-updated.
Last update: 2024-08-28 03:56:56 UTC
README
翻译行为是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模型引用完整
使用
后端
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}' ], ], ]); ?>
结果,在创建新页面后,将获得一些按钮以在不同语言中编辑内容
因此,您可以获取当前模型的语言
/** * @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
中找到。