omgdef/yii2-multilingual-behavior

yii 的 yii-multilingual-behavior 的端口

安装次数: 139 773

依赖者: 11

建议者: 0

安全: 0

星标: 146

关注者: 19

分支: 60

开放问题: 26

类型:yii2-extension

2.1.2 2016-02-12 10:38 UTC

This package is auto-updated.

Last update: 2024-09-06 17:13:11 UTC


README

这是 yii-multilingual-behavior 的 Yii2 版本。

Packagist Version Total Downloads Build Status Code Quality Code Coverage

此行为允许您创建多语言模型,并几乎像使用普通模型一样使用它们。翻译存储在数据库中的单独表中(例如: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 发送后翻译将不会更新。