omgdef / yii2-multilingual-behavior
yii 的 yii-multilingual-behavior 的端口
2.1.2
2016-02-12 10:38 UTC
Requires
- yiisoft/yii2: *
Requires (Dev)
- phpunit/dbunit: >=1.2
- phpunit/phpunit: 4.6.*
This package is auto-updated.
Last update: 2024-09-06 17:13:11 UTC
README
这是 yii-multilingual-behavior 的 Yii2 版本。
此行为允许您创建多语言模型,并几乎像使用普通模型一样使用它们。翻译存储在数据库中的单独表中(例如:PostLang 或 ProductLang),每个模型一个,因此您可以轻松地添加或删除语言,而无需修改数据库。
!!! 重要 !!! 版本 1 的文档在此处 这里*
在版本 2 中。 forceOverwrite 属性已弃用*
示例
示例 #1:默认情况下,当前语言的翻译会作为正常属性插入到模型中。
//Assuming current language is english $model = Post::findOne(1); echo $model->title; //echo "English title" //Now let's imagine current language is french $model = Post::findOne(1); echo $model->title; //echo "Titre en Français" $model = Post::find()->localized('en')->one(); echo $model->title; //echo "English title" //Current language is still french here
示例 #2:如果您在 find()
查询中使用 multilingual()
,每个模型的翻译都将作为虚拟属性(title_en, title_fr, title_de, ...)加载。
$model = Post::find()->multilingual()->one(); echo $model->title_en; //echo "English title" echo $model->title_fr; //echo "Titre en Français"
安装
安装此扩展的首选方法是使用 composer。
运行以下命令:
php composer.phar require --prefer-dist omgdef/yii2-multilingual-behavior
或将以下内容添加到您的 composer.json
文件的 require 部分:
"omgdef/yii2-multilingual-behavior": "~2.0"
行为属性
以下属性被标记为粗体,为必填项
用法
以下是一个示例基础 'post' 表
CREATE TABLE IF NOT EXISTS `post` ( `id` int(11) NOT NULL AUTO_INCREMENT, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, `enabled` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
以及其关联的翻译表(配置为默认),假设翻译字段为 'title' 和 'content'
CREATE TABLE IF NOT EXISTS `postLang` ( `id` int(11) NOT NULL AUTO_INCREMENT, `post_id` int(11) NOT NULL, `language` varchar(6) NOT NULL, `title` varchar(255) NOT NULL, `content` TEXT NOT NULL, PRIMARY KEY (`id`), KEY `post_id` (`post_id`), KEY `language` (`language`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `postLang` ADD CONSTRAINT `postlang_ibfk_1` FOREIGN KEY (`post_id`) REFERENCES `post` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
将此行为附加到模型(示例中的 Post)。注释的字段具有默认值。
public function behaviors() { return [ 'ml' => [ 'class' => MultilingualBehavior::className(), 'languages' => [ 'ru' => 'Russian', 'en-US' => 'English', ], //'languageField' => 'language', //'localizedPrefix' => '', //'requireTranslations' => false', //'dynamicLangClass' => true', //'langClassName' => PostLang::className(), // or namespace/for/a/class/PostLang 'defaultLanguage' => 'ru', 'langForeignKey' => 'post_id', 'tableName' => "{{%postLang}}", 'attributes' => [ 'title', 'content', ] ], ]; }
然后您需要在模型中重写 find()
方法
public static function find() { return new MultilingualQuery(get_called_class()); }
由于此行为具有 MultilingualTrait
,您可以在查询类中使用它
namespace app\models; use yii\db\ActiveQuery; class MultilingualQuery extends ActiveQuery { use MultilingualTrait; }
表单示例
//title will be saved to model table and as translation for default language $form->field($model, 'title')->textInput(['maxlength' => 255]); $form->field($model, 'title_en')->textInput(['maxlength' => 255]);
提示: $model
必须包含相关的 translations
数据,否则在 $form
发送后翻译将不会更新。