PHPackages                             igaster/laravel-translate-eloquent - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Localization &amp; i18n](/categories/localization)
4. /
5. igaster/laravel-translate-eloquent

ActiveLibrary[Localization &amp; i18n](/categories/localization)

igaster/laravel-translate-eloquent
==================================

Description

v1.2.8(6y ago)403.4k5[2 issues](https://github.com/igaster/laravel-translate-eloquent/issues)[1 PRs](https://github.com/igaster/laravel-translate-eloquent/pulls)MITPHPCI failing

Since Dec 26Pushed 1mo ago6 watchersCompare

[ Source](https://github.com/igaster/laravel-translate-eloquent)[ Packagist](https://packagist.org/packages/igaster/laravel-translate-eloquent)[ Docs](https://github.com/igaster/laravel-translate-eloquent.git)[ RSS](/packages/igaster-laravel-translate-eloquent/feed)WikiDiscussions master Synced yesterday

READMEChangelog (10)Dependencies (3)Versions (13)Used By (0)

Description
-----------

[](#description)

[![Laravel](https://camo.githubusercontent.com/43b3e85f14e8fc6c53cd7c047358b29b574359480c62ded0137bd3f50ede699f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d6f72616e67652e737667)](http://laravel.com)[![License](https://camo.githubusercontent.com/4661abfe916186acde514558e7f040833cb63ba7098401a51ce339cbb2b4cf9e/687474703a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e737667)](https://tldrlegal.com/license/mit-license)[![Downloads](https://camo.githubusercontent.com/96475753a669483ec091d0e3ce5108deb499645cff4b71a2bf3881656ac66f5c/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f696761737465722f6c61726176656c2d7472616e736c6174652d656c6f7175656e742e737667)](https://packagist.org/packages/igaster/laravel-translate-eloquent)[![Build Status](https://camo.githubusercontent.com/1729a8d3cf4a34f27da4c48176229b797384e5a1d655627f113f70873e90968c/68747470733a2f2f696d672e736869656c64732e696f2f7472617669732f696761737465722f6c61726176656c2d7472616e736c6174652d656c6f7175656e742e737667)](https://travis-ci.org/igaster/laravel-translate-eloquent)[![Codecov](https://camo.githubusercontent.com/9c5fc3ca1d23e48659e3abc54af952d75f216068ec18a3bd14bd0e6a0f4f90cd/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f6769746875622f696761737465722f6c61726176656c2d7472616e736c6174652d656c6f7175656e742e737667)](https://codecov.io/github/igaster/laravel-translate-eloquent)

Translate any column in your Database in Laravel models. You need only one additional table to store translations for all your models.

Installation
------------

[](#installation)

Edit your project's `composer.json` file to require:

```
"require": {
    "igaster/laravel-translate-eloquent": "~1.0"
}

```

and install with `composer update`

Setup
-----

[](#setup)

### Step 1: Create Translation Table:

[](#step-1-create-translation-table)

Create a new migration with `artisan make:migration translations` and create the following table:

```
    public function up()
    {
        Schema::create('translations', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('group_id')->unsigned()->index();
            $table->text('value')->nullable();
            $table->string('locale', 2)->index(); // Can be any length!
        });
    }

    public function down()
    {
        Schema::drop('translations');
    }
```

migrate the database: `php artisan migrate`

### Step 2: Add translatable keys to you models

[](#step-2-add-translatable-keys-to-you-models)

In your migrations define any number of integer keys that you want to hold translations. (Actually they are foreign key to the translatable.group\_id). This is an example migration that will create a translatable key:

```
    $table->integer('key')->unsigned()->nullable();
```

### Step 3: Setup your model:

[](#step-3-setup-your-model)

Apply the `TranslationTrait` trait to any model that you want to have translatable keys and add these keys into the `$translatable` array:

```
class ExampleModel extends Eloquent
{
    use \igaster\TranslateEloquent\TranslationTrait;

    protected static $translatable = ['key'];
}
```

Now you are ready to use translated keys!

Usage
-----

[](#usage)

When you access a translatable key, then it's translation will be retrieved in the application's current locale. If no translation is defined then the Laravel's 'app.fallback\_locale' will be used. If neither translation is found then an empty string will be returned. So simple!

### Work with translations:

[](#work-with-translations)

```
$model->key='Monday';                    // Set the translation for the current Locale.
$model->key;                             // Get the translation for the current Locale

$model->translate('de')->key = 'Montag'; // Set translation in a locale
$model->translate('de')->key;            // Get translation in a locale
$model->translate('de','en')->key;       // Get translation in a locale / fallback locale

$model->key = [                          // Set a batch of translations
    'el' => 'Δευτέρα',
    'en' => 'Monday',
    'de' => 'Montag',
];
```

Important notes:

- When you create a new translation for the first time, you must save your model to persist the relationship: `$model->save();`. This is not necessary when updating a translation or adding a new locale.
- When you set a value for a translation then an entry in the `translations` table will be created / updated.

### Create/Update translated models:

[](#createupdate-translated-models)

```
// Create a model translated to current locale
Day::create([
    'name' => 'Πέμπτη',
]);

// Create a model with multiple translations
Day::create([
    'name' => [
        'el' => 'Σάββατο',
        'en' => 'Saturday',
    ]
]);
```

You can also use `$model->update();` with the same way.

### Laravel &amp; Locales:

[](#laravel--locales)

A short refreshment in Laravel locale functions (Locale is defined in `app.php` configuration file):

```
App::setLocale('de');                    // Set curent Locale
App::getLocale();                        // Get curent Locale
Config::set('app.fallback_locale','el'); // Set fallback Locale
```

### Working with the `Translations` object

[](#working-with-the-translations-object)

You can achieve the same functionality with the `igaster\TranslateEloquent\Translations` object.

```
$translations = $model->translations('key'); // Get instance of Translations

$translations->in('de');             // Get a translation in a locale
$translations->set('el', 'Δευτέρα'); // Set a translation in a locale
$translations->has('el');            // Check if a translation exists

$translations->set([                 // Set a batch of translations
    'el' => 'Δευτέρα',
    'en' => 'Monday',
    'de' => 'Montag',
]);
```

Want to dive deeper into the internals?

- `Translations` object holds all translations for a key. Multiple transltions are grouped under the same `group_id` value
- `Translation` object is an Eloquent model (maps to the `translations` table) that represents a single translation for one key in one locale

```
$translations = new Translations();          // Create a new Translations collection
$translations = new Translations($group_id); // or load Translations with $group_id
$translations->group_id;  // column `translations.group_id` groups all translations for a key

$translation = $translations->get('en');  // Get instance of `Translation` (a single translation)
$translation->id;                   // From this model you have access to the actual translations record
$translation->value='New Value';    // in your database. You can perform any raw opperation on it.
```

Eager Loading:
--------------

[](#eager-loading)

You can use these query scopes as if you want to retrieve a translation with the same query:

```
Day::findWithTranslation(1,'name');   // Day with id 1 with 'name' translated in the current Locale
Day::firstWithTranslation('name');    // First Day from the query with 'name' translated in the current Locale
Day::getWithTranslation('name');      // Collection of Day with 'name' translated in the current Locale
Day::allWithTranslation('name');      // Collection of Day with 'name' translated in the current Locale

// You can specify a locale as an extra parameter in all above scopes:
Day::firstWithTranslation('name', 'en');    // First Day from the query with 'name' translated in English

// The column name is optional and defaults to first item in your `$translatable` array:
Day::firstWithTranslation();    // First Day from the query with the first $translatable column (='name')
                                // translated in the current Locale
```

Notes:

- The above query scopes should be used as an endpoint of your queries as they will return either a Model or a Collection
- Eager loading is designed to reduce to a single query the read operations when you are retrieving a model from the Database. It uses a JOIN statement and not two subsequent queries as opposed to Eloquent eager loading. One limitation of this implementation is that you can only request the translation of a single field.
- If your models have multiple keys that should be translated then all the subsequent read operations will result in an extra query.

Performance considerations:
---------------------------

[](#performance-considerations)

Please notice that using a single Table for all translations is not the optimal architecture when considering database performance. Each translation requires one seperate query to the database. If performance is an issue you can check alternative implementations like [dimsav/laravel-translatable](https://github.com/dimsav/laravel-translatable)

Handle \_\_get() &amp; \_\_set() Conflicts:
-------------------------------------------

[](#handle-__get--__set-conflicts)

This Trait makes use of the `__get()` and `__set()` magic methods to perform its ... well... magic! However if you want to implement these functions in your model or another trait then php will complain about conflicts. To overcome this problem you have to hide the Traits methods when you import it:

```
use igaster\TranslateEloquent\TranslationTrait {
    __get as private;
    __set as private;
}
```

and call them manually from your `__get()` / `__set()` methods:

```
//--- copy these in your model if you need to implement __get() __set() methods

public function __get($key) {
    // Handle Translatable keys
    $result=$this->translatable_get($key);
    if ($this->translatable_handled)
        return $result;

    //your code goes here

    return parent::__get($key);
}

public function __set($key, $value) {
    // Handle Translatable keys
    $this->translatable_set($key, $value);
    if ($this->translatable_handled)
        return;

    //your code goes here

    parent::__set($key, $value);
}
```

Todo
----

[](#todo)

- Cascade delete model + translations Fixed
- Eager Load multiple keys per request...
- any ideas? Send me a request...

###  Health Score

47

—

FairBetter than 93% of packages

Maintenance60

Regular maintenance activity

Popularity30

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity70

Established project with proven stability

 Bus Factor1

Top contributor holds 98.5% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~127 days

Recently: every ~189 days

Total

12

Last Release

2441d ago

Major Versions

v0.1 → v1.0.02015-12-27

### Community

Maintainers

![](https://www.gravatar.com/avatar/55bf1c9bc1f0553b439f18852299833373f96eb6c1342434c74fb61c5aecd508?d=identicon)[igaster](/maintainers/igaster)

---

Top Contributors

[![igaster](https://avatars.githubusercontent.com/u/4586319?v=4)](https://github.com/igaster "igaster (65 commits)")[![lpmi-13](https://avatars.githubusercontent.com/u/5070516?v=4)](https://github.com/lpmi-13 "lpmi-13 (1 commits)")

---

Tags

laravelpackagetranslationtranslate-databasetranslate-models

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/igaster-laravel-translate-eloquent/health.svg)

```
[![Health](https://phpackages.com/badges/igaster-laravel-translate-eloquent/health.svg)](https://phpackages.com/packages/igaster-laravel-translate-eloquent)
```

###  Alternatives

[larastan/larastan

Larastan - Discover bugs in your code without running it. A phpstan/phpstan extension for Laravel

6.5k55.4M7.9k](/packages/larastan-larastan)[askdkc/breezejp

Laravel Starter Kit (Livewire+Breeze+Laravel UI+Jetstream)や標準のバリデーションメッセージを全て一瞬で日本語化し、言語切替機能も提供するパッケージです / This package provides all-in-one Japanese translation for Laravel StarterKit (Livewire StarterKit, Breeze, Laravel UI and Jetstream) packages and validation messages with language switching feature.

593277.6k1](/packages/askdkc-breezejp)[spatie/laravel-pdf

Create PDFs in Laravel apps

1.0k4.8M44](/packages/spatie-laravel-pdf)[psalm/plugin-laravel

Psalm plugin for Laravel

3355.3M341](/packages/psalm-plugin-laravel)[laravel/ai

The official AI SDK for Laravel.

1.0k3.2M173](/packages/laravel-ai)[elegantly/laravel-translator

All on one translations management for Laravel

6333.1k](/packages/elegantly-laravel-translator)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
