nicklasos
3/3/2015 - 4:07 PM

Yii1 translations

Yii1 translations

<?php

class TranslationBehavior extends CActiveRecordBehavior
{
    public $model;
    public $id;
    public $secondaryId;
    public $post;
    public $localeField = 'locale';
    public $fields = [];

    public function locale($locale = Locales::DEFAULT_LANG)
    {
        $model = $this->model;
        $translationModel = $this->getTranslationModel($locale);
        if ($translationModel) {
            return $translationModel;
        }

        return new $model;
    }

    public function afterSave($event)
    {
        $params = param($this->post);
        $model = $this->model;

        foreach (Locales::languages() as $lang) {
            $translationModel = $this->getTranslationModel($lang);
            if (!$translationModel) {
                $translationModel = new $model;
            }

            $translationModel->{$this->localeField} = $lang;
            $translationModel->{$this->secondaryId} = $event->sender->id;

            foreach ($this->fields as $field) {
                $translationModel->$field = $params[$lang][$field];
            }

            $translationModel->save();
        }
    }

    /**
     * @param string $locale
     * @return CActiveRecord
     */
    private function getTranslationModel($locale)
    {
        /**
         * @var CActiveRecord $model
         */
        $model = $this->model;
        return $model::model()->find("{$this->secondaryId} = :id AND {$this->localeField} = :locale", [
            'id' => $this->id,
            'locale' => $locale
        ]);
    }
}
<?php

class Concept extends WActiveRecord
{
    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }

    public function tableName()
    {
        return 'concept';
    }

    public function behaviors()
    {
        return [
            'translation' => [
                'class' => 'TranslationBehavior',
                'id' => $this->id,
                'secondaryId' => 'concept_id',
                'model' => ConceptContent::class,
                'post' => 'Concept',
                'localeField' => 'lang',
                'fields' => ['name', 'description']
            ]
        ];
    }
}