sichkarev/yii2-translatable-attributes

组件支持ActiveRecord模型的可翻译属性

1.1 2020-11-21 12:29 UTC

This package is auto-updated.

Last update: 2024-09-24 00:45:00 UTC


README

如果您需要将ActiveRecord模型的某些属性翻译成多种语言,则此组件对您非常有用。

要求

  • Yii2
  • PHP 5.6及以上

安装

通过composer安装

composer require sichkarev/yii2-translatable-attributes "dev-master"

连接

  1. 创建一个用于存储翻译的json(最佳)、text或varchar类型的字段
$this->addColumn('table','translations', $this->json()->comment('Переводы'));
  1. 在Yii2配置文件的components部分连接TranslatableComponent,并指定使用的语言列表
    'components' => [
        /* другие компоненты */
        'translate' => [
            'class' => TranslatableComponent::class,
            'languages' => [
                Russian::class,
                Ukrainian::class,
                English::class,
            ],
            'defaultLanguage' => Russian::class
        ]
    ]

为了添加新语言,在类中实现LanguageInterface,填写必要的数据,并将其添加到属性languages

  1. 将TranslateActiveRecordTrait连接到需要翻译属性的模型类
use TranslateActiveRecordTrait;
  1. 连接TranslatableBehavior,例如使用addTranslatableBehavior(在TranslateActiveRecordTrait中实现)
  2. 为类实现TranslatableInterface并创建方法attributeNameForTranslate()。此方法应返回在步骤1中创建的现有字段名称。
class TestTranslatableModel extends ActiveRecord implements TranslatableInterface
{
    public function behaviors()
    {
        return ArrayHelper::merge (
            parent::behaviors(),
            self::addTranslatableBehavior()
        );
    }

    public function attributeNameForTranslate()
    {
        return 'translations';
    }
}
  1. 在类的注释中,指出具有每个语言特定值的字段,并添加单词@translate。为了便于使用,需要描述具有翻译的属性,但它们可以物理上不创建(它们将被动态创建)。这些属性是模型的一部分,可以参与验证和其他应用任务(例如在CRUD中)。如果需要自定义标签,则可以在方法attributeLabels()中添加字段名称。
/**
 * This is comment of class TestTranslatableModel
 * @property string  name        @translate
 * @property string  description @translate
 * 
 * Translatable properties:
 * @property string nameEn 
 * @property string nameUa
 * @property string descriptionEn
 * @property string descriptionUa
*/
  1. 添加在CRUD表单中编辑字段的功能
<?=$form->field($model, 'name')->widget(TranslateInput::class, [
    'className' => 'col-md-6'
]);?>

属性className指定将应用于块的外部CSS类

函数

  • setContextLanguage(LanguageInterface $lang) - 设置语言上下文
  • clearLangContext() - 清除语言上下文
  • andFilterWhereTranslate - 添加对字段的筛选
$query->andFilterWhereTranslate(['like', 'nameEn', '%' . $this->nameEn . '%'])

例如

if ($promocodeType = PromocodeType::findOne(1)) {
    $promocodeType->name = 'Русский';
    $promocodeType->nameUa = 'Украинский';
    $promocodeType->setLangContext(new Ukrainian());
    echo $promocodeType->name; //Украинский
}

在测试用例src/Tests/TranslateActiveRecordTest.php中展示了各种功能的完整示例。

测试CRUD

为了理解项目中的所有工作,有一个测试CRUD。要启动测试CRUD,请执行以下操作:

  1. 将模块连接到您的目录之一(后端、前端)
'modules' => [

    /* другие модули */

    'translate' => [
        'class' => TranslatableCrudModule::class
    ],
]
  1. 运行迁移以创建测试表
php yii migrate --migrationPath=@vendor/sichkarev/yii2-translatable-attributes/src/Migrations --interactive=0
  1. 打开您目录的/translate/地址的CRUD

好像就这样了,如果有什么问题,请留言、修改代码并提交请求。