2amigos / yii2-translateable-behavior
为Yii2提供ActiveRecord属性翻译。
Requires
- yiisoft/yii2: *
Requires (Dev)
- phpunit/phpunit: ^6.5
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_DELETE
或ActiveRecord::EVENT_AFTER_DELETE
,以控制在哪个事件上执行记录的删除。您可以将'deleteEvent'
设置为false
来禁用删除,并依赖数据库外键级联或实现您自己的方法。
当在ActiveRecord中使用Translateable行为时,您应该为删除操作启用transactions()。
网络开发从未如此有趣!
www.2amigos.us