novius/laravel-translatable

A Laravel Eloquent model trait for translatable resource

1.0.0 2024-07-10 12:33 UTC

This package is auto-updated.

Last update: 2024-10-10 13:11:03 UTC


README

Novius CI Packagist Release License: AGPL v3

Introduction

A package for making Laravel Eloquent models "translatable" using 2 fields : locale and locale_parent_id.

Requirements

  • Laravel >= 10.0
  • PHP >= 8.2

NOTE: These instructions are for Laravel >= 10.0 and PHP >= 8.2 If you are using prior version, please see the previous version's docs.

Installation

You can install the package via composer:

composer require novius/laravel-translatable
php artisan vendor:publish --provider="Novius\Translatable\LaravelTranslatableServiceProvider" --tag=lang

Usage

Migrations

Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->translatable(); // Macro provided by the package
    $table->string('title');
    $table->text('text');
    $table->timestamps();
});

Eloquent Model Trait

namespace App\Models;

use \Illuminate\Database\Eloquent\Model;
use Novius\LaravelTranslatable\Traits\Translatable;

class Post extends Model {
    use Translatable;
    ...
}

This trait add :

  • A relation translations containing all translations of the model
  • A relation translationsWithDeleted containing all translations of the model, including those in trash if your model use SoftDelete trait
  • A function translate(string $locale, array $translateAttributes = []) to translate a model in a new locale
  • A function getTranslation(string $locale, bool $withDeleted = false) returning the translated model in specified locale or null if it doesn't exist.
  • A scope withLocale($locale) on query
$post = new Post([
    'title' => 'Français',
]);
$post->save()

$post->translate('en', ['title' => 'English']);
$post->translate('es', ['title' => 'Español']);

// All translation including `fr`
$allTranslations = $post->translations;

$englishTranslation = $post->getTranslation('en');

// $italianTranslation is null
$italianTranslation = $post->getTranslation('it');

You can override the translateAttributes method of the trait if you want to translate some attributes of the model before saving:

namespace App\Models;

use \Illuminate\Database\Eloquent\Model;
use Novius\LaravelTranslatable\Traits\Translatable;

class Post extends Model {
    use Translatable;

    protected function translateAttributes($parent): void
    {
        $this->some_attribut = $parent->some_attribut.' translated';
    }
    ...
}

Testing

composer run test

CS Fixer

Lint your code with Laravel Pint using:

composer run cs-fix

Licence

This package is under GNU Affero General Public License v3 or (at your option) any later version.