rahmanramsi/laravel-translatable

This is my package laravel-translatable

1.0.0 2025-05-23 01:57 UTC

This package is auto-updated.

Last update: 2025-05-23 03:37:42 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

Laravel Translatable is a package for easily attaching arbitrary translation data to Eloquent Models.

Features

  • One-to-many polymorphic relationship allows attaching translated data to Eloquent models without needing to adjust the database schema.

Installation & Setup

You can install the package via composer:

composer require rahmanramsi/laravel-translatable

You can publish and run the migrations with:

php artisan vendor:publish --tag="translatable-migrations"
php artisan migrate

You can publish the config file with:

php artisan vendor:publish --tag="translatable-config"

This is the contents of the published config file:

return [
    'model' => Translate::class,
];

Making a model translatable

The required steps to make a model translatable are:

  • First, you need to add the RahmanRamsi\LaravelTranslatable\HasTranslations trait.
  • Next, you should create a public property $translatable which holds an array with all the names of attributes you wish to make translatable.

Here's an example of a prepared model:

use Illuminate\Database\Eloquent\Model;
use RahmanRamsi\LaravelTranslatable\HasTranslations;

class Post extends Model
{
    use HasTranslations;

    public array $translatable = ['title'];
}

Basic Usage

Getting and setting translations

First, you must prepare your model as instructed in the installation instructions.

Setting a translation

Here's an example, given that name is a translatable attribute:

$post->title = 'hello';

Changes automatically saved

To set a translation for a specific locale you can use this method:

public function setTranslation(string $key, string $locale, string $value)

You can set translations for multiple languages with

$translations = ['en' => 'hello', 'es' => 'hola'];

$post->setTranslations('title', $translations);

Getting a translation

The easiest way to get a translation for the current locale is to just get the property for the translated attribute. For example (given that name is a translatable attribute):

$post->title;

You can also use this method:

public function getTranslation(string $key, string $locale, bool $useFallbackLocale = true)
Getting all translations

You can get all translations by calling getTranslations() without an argument:

$post->getTranslations();

Or you can use the accessor:

$post->translations

The methods above will give you back an array that holds all translations, for example:

$post->getTranslations('title'); 
// returns ['en' => 'hello', 'es' => 'hola']

The method above returns, all locales. If you only want specific locales, pass that to the second argument of getTranslations.

public function getTranslations(string $attributeName)

Here's an example:

$translations = [
    'en' => 'Hello',
    'fr' => 'Bonjour',
    'de' => 'Hallo',
];

$newsItem->setTranslations('hello', $translations);
$newsItem->getTranslations('hello', ['en', 'fr']); // returns ['en' => 'Hello', 'fr' => 'Bonjour']

Get locales that a model has

You can get all locales that a model has by calling locales() without an argument:

$translations = ['en' => 'hello', 'es' => 'hola'];
$post->name = $translations;

$post->locales(); // returns ['en', 'es']

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.