Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/2amigos/yii2-translateable-behavior
Handles ActiveRecord's attribute translations
https://github.com/2amigos/yii2-translateable-behavior
Last synced: about 2 months ago
JSON representation
Handles ActiveRecord's attribute translations
- Host: GitHub
- URL: https://github.com/2amigos/yii2-translateable-behavior
- Owner: 2amigos
- License: bsd-3-clause
- Archived: true
- Created: 2014-03-26T14:27:48.000Z (about 10 years ago)
- Default Branch: master
- Last Pushed: 2019-01-18T22:42:00.000Z (over 5 years ago)
- Last Synced: 2024-04-01T00:32:02.925Z (3 months ago)
- Language: PHP
- Size: 63.5 KB
- Stars: 66
- Watchers: 23
- Forks: 28
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Lists
- list - 2amigos/yii2-translateable-behavior - Handles ActiveRecord's attribute translations. (Extensions / Database)
- list - 2amigos/yii2-translateable-behavior - Handles ActiveRecord's attribute translations. (Extensions / Database)
- awesome-yii - 2amigos/yii2-translateable-behavior - handles ActiveRecord's attribute translations. (Extensions / Database)
README
TranslateableBehavior for Yii2
==============================This behavior has been inspired by the great work of Mikehaertl's
[Translatable Behavior](https://github.com/mikehaertl/translatable) for Yii 1.*.It eases the translation of ActiveRecord's attributes as it maps theme from a translation table into the main record. It
also automatically loads application language by default.Sample of use:
```php
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();```
Installation
------------The preferred way to install this extension is through [composer](http://getcomposer.org/download/).
Either run
```
php composer.phar require "2amigos/yii2-translateable-behavior"
```
or add```json
"2amigos/yii2-translateable-behavior" : "~1.1"
```to the require section of your application's `composer.json` file.
Usage
-----### Preparation
First you need to move all the attributes that require to be translated into a separated table. For example, imagine we
wish to keep translations of title and description from our tour entity. Our schema should result on the following:```
+--------------+ +--------------+ +-------------------+
| tour | | tour | | tour_lang |
+--------------+ +--------------+ +-------------------+
| id | | id | | id |
| title | ---> | created_at | + | tour_id |
| description | | updated_at | | language |
| created_at | +--------------+ | title |
| updated_at | | description |
+--------------+ +-------------------+```
After we have modified our schema, now we need to define a relation in our `ActiveRecord` object. The following example
assumes that we have already created a `TourLang` model (see the schema above):```php
/**
* @return \yii\db\ActiveQuery
*/
public function getTranslations()
{
return $this->hasMany(TourLang::className(), ['tour_id' => 'id']);
}
```Finally, we need to attach our behavior.
```
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'
]
],
];
}
```### Basic Usage
```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 fr translation only
$tour->saveTranslation();
```You may also set multiple translations directly:
```php
$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();
```### Fallback language
In case no translation is available for a specific language the behavior allows to specify a fallback translation to load instead.
By default the fallback will use the application source language. It can be configured by setting the `fallbackLanguage` property of the behavior.Fallback language can be configured to be a single language or per language:
```php
// 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
],
```Additionally to the configurable fallback a fallback to non-localized language is applied automatically.
E.g. if no translation exists for `de-AT` (German in Austria) the translation will fall back to `de`.
The fallback goes further if `de` is not found using the `fallbackLanguage` configuration, so from the example
above it will then try `en`.When the fallback is defined in array format and no fallback can be found for a language, the first fallback is returned.
You may disable the fallback mechanism by setting `fallbackLanguage` to `false`.
If you want to configure fallback languages globally, you can do so by configuring the `TranslateableBehavior` class
in Yii DI container:```php
Yii::$container->set('dosamigos\translateable\TranslateableBehavior', ['fallbackLanguage' => 'de']);
```### Deleting translations
By default, when an active record is deleted, translation records are deleted in the `afterSave` event.
However some database scenarios require different configuration, in case foreign keys restrict the deletion of records.You may configure `'deleteEvent'` to be either `ActiveRecord::EVENT_BEFORE_DELETE` or `ActiveRecord::EVENT_AFTER_DELETE` to
control on which event the deletion of records should be performed.
You may set `'deleteEvent'` to `false` to disable deletion and rely on DB foreign key cascade or implement your own method.When using the Translateablebehavior in an ActiveRecord you should enable [transactions()](https://www.yiiframework.com/doc/api/2.0/yii-db-activerecord#transactions()-detail)
for the delete operation.> [![2amigOS!](http://www.gravatar.com/avatar/55363394d72945ff7ed312556ec041e0.png)](http://www.2amigos.us)
Web development has never been so fun!
[www.2amigos.us](http://www.2amigos.us)