2amigos/yii2-translateable-behavior

此包已被废弃,不再维护。未建议替代包。

为Yii2提供ActiveRecord属性翻译。

安装次数: 99 033

依赖者: 10

推荐者: 0

安全性: 0

星级: 66

关注者: 23

分支: 23

开放问题: 1

类型:yii2-extension

1.1.1 2018-10-31 15:11 UTC

This package is auto-updated.

Last update: 2023-08-16 03:02:24 UTC


README

此行为受到Mikehaertl的Translatable Behavior(为Yii 1.*)的启发。

它简化了ActiveRecord属性翻译,因为它将翻译表的主题映射到主记录。它还默认自动加载应用程序语言。

使用示例

<?php

// create a record
$tour = new Tour;

$tour->title = "English title";

// save both the new Tour and a related translation record with the title
$tour->save();


// change language
$tour->language = 'fr';

$tour->title = "French title";

// save translation only
$tour->saveTranslation();

安装

安装此扩展的首选方式是通过composer

运行以下命令之一:

php composer.phar require "2amigos/yii2-translateable-behavior"

或者添加以下内容到您的应用程序的composer.json文件的require部分:

"2amigos/yii2-translateable-behavior" : "~1.1"

使用方法

准备

首先,您需要将所有需要翻译的属性移动到单独的表中。例如,假设我们希望保留从我们的旅游实体中获取的标题和描述的翻译。我们的模式应如下所示:

    +--------------+        +--------------+        +-------------------+
    |     tour     |        |     tour     |        |      tour_lang    |
    +--------------+        +--------------+        +-------------------+
    |           id |        |           id |        |                id |
    |        title |  --->  |   created_at |   +    |           tour_id |
    |  description |        |   updated_at |        |          language |
    |   created_at |        +--------------+        |             title |
    |   updated_at |                                |       description |
    +--------------+                                +-------------------+

修改我们的模式后,现在我们需要在ActiveRecord对象中定义一个关系。以下示例假设我们已经创建了一个TourLang模型(参见上面的模式)

/**
* @return \yii\db\ActiveQuery
*/
public function getTranslations()
{
    return $this->hasMany(TourLang::className(), ['tour_id' => 'id']);
}

最后,我们需要附加我们的行为。

use dosamigos\translateable\TranslateableBehavior;

\\ ...

public function behaviors()
{
    return [
        'trans' => [ // name it the way you want
            'class' => TranslateableBehavior::className(),
            // in case you named your relation differently, you can setup its relation name attribute
            // 'relation' => 'translations',
            // in case you named the language column differently on your translation schema
            // 'languageField' => 'language',
            'translationAttributes' => [
                'title', 'description'
            ]
        ],
    ];
}

基本使用方法

// create a record
$tour = new Tour;
$tour->title = "English title";

// save both the new Tour and a related translation record with the title
$tour->save();


// change language
$tour->language = 'fr';

$tour->title = "French title";

// save fr translation only
$tour->saveTranslation();

您还可以直接设置多个翻译

$tour = new Tour;
$tour->title = [
  'translations' => [
     'en' => "English title",
     'de' => "Deutscher Titel",
  ],
];

// save both the new Tour and a related translation record with the title
$tour->save();

备用语言

如果特定语言没有可用的翻译,该行为允许指定要加载的备用翻译。默认情况下,备用语言将使用应用程序源语言。可以通过设置行为的fallbackLanguage属性来配置。

备用语言可以配置为单语言或多语言

// use english as fallback for all languages when no translation is available
'fallbackLanguage' => 'en',
// alternatively:
'fallbackLanguage' => [
    'de' => 'en', // fall back to English if German translation is missing
    'uk' => 'ru', // fall back to Russian if no Ukrainian translation is available
],

除了可配置的备用语言之外,还会自动应用非本地化语言的备用。例如,如果没有为de-AT(奥地利德语)提供翻译,则翻译将回退到de。如果未使用fallbackLanguage配置找到de,则回退将进一步进行,因此从上面的示例中,它将尝试en

当备用语言以数组格式定义且找不到备用语言时,将返回第一个备用。

您可以通过将fallbackLanguage设置为false来禁用备用机制。

如果您想全局配置备用语言,可以在Yii DI容器中配置TranslateableBehavior类。

Yii::$container->set('dosamigos\translateable\TranslateableBehavior', ['fallbackLanguage' => 'de']);

删除翻译

默认情况下,当删除活动记录时,翻译记录会在afterSave事件中被删除。然而,某些数据库场景需要不同的配置,以防外键限制了记录的删除。

您可以配置'deleteEvent'ActiveRecord::EVENT_BEFORE_DELETEActiveRecord::EVENT_AFTER_DELETE,以控制在哪个事件上执行记录的删除。您可以将'deleteEvent'设置为false来禁用删除,并依赖数据库外键级联或实现您自己的方法。

当在ActiveRecord中使用Translateable行为时,您应该为删除操作启用transactions()

2amigOS!
网络开发从未如此有趣!
www.2amigos.us