Skip to content

novius/laravel-translatable

Repository files navigation

Laravel Translatable

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.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages