PHPackages                             profscode/translatable - 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. profscode/translatable

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

profscode/translatable
======================

File-based translatable package with versioning for Laravel

v1.1.6(6mo ago)031MITPHPPHP ^8.1 || ^8.2 || ^8.3 || ^8.4

Since Oct 21Pushed 6mo agoCompare

[ Source](https://github.com/YamanHafez/profscode-translatable)[ Packagist](https://packagist.org/packages/profscode/translatable)[ RSS](/packages/profscode-translatable/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (1)Versions (10)Used By (0)

Profscode Translatable for Laravel
==================================

[](#profscode-translatable-for-laravel)

Profscode Translatable is an advanced translation system for Laravel Eloquent models.
It stores translations in **both Lang Files and Database**, supports UUID, automatically renames translation files when IDs change, and preserves full translation history (`name_old1`, `name_old2`, …).

This package is fully compatible with Laravel’s Eloquent lifecycle — **no getAttribute override**, no model breakage, no conflicts.

---

Features
--------

[](#features)

- Translate any model attribute by adding it to `$translatable`
- Stores translations in:
    - `/lang/{locale}/{Model}/{id}.php`
    - `profscode_translates` database table
- Keeps history of old translations (`key_old1`, `key_old2`, …)
- Automatically renames translation files when model ID changes
- Works with **UUID** or **Auto-Increment ID**
- Returns translated value using `$model->attribute`
- Raw value always accessible using `getRawOriginal()`
- Fallback order:
    1. Lang file
    2. Database
    3. Null
- Zero interference with `getAttribute()` and Eloquent internals
- No need to manually define accessors

---

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

[](#installation)

Install via Composer:

```
composer require profscode/translatable
```

Run migrations:

```
php artisan migrate
```

---

Usage
-----

[](#usage)

### 1. Add the trait to your model:

[](#1-add-the-trait-to-your-model)

```
use Profscode\Translatable\Translatable;

class Blog extends Model
{
    use Translatable;

    protected $translatable = ['name', 'description'];

    protected $fillable = ['name', 'description'];
}
```

---

### 2. Creating a translated model:

[](#2-creating-a-translated-model)

```
Blog::create([
    'name' => [
        'en' => 'Hello',
        'tr' => 'Merhaba',
    ],
    'description' => [
        'en' => 'Description here',
        'tr' => 'Açıklama burada',
    ]
]);
```

This generates:

```
/lang/en/Blog/{id}.php
/lang/tr/Blog/{id}.php

```

And database rows inside `profscode_translates`.

---

### 3. Reading translations:

[](#3-reading-translations)

```
$blog = Blog::find(1);
echo $blog->name;         // returns translation based on app()->getLocale()
echo $blog->description;
```

---

### 4. Switching locale:

[](#4-switching-locale)

```
app()->setLocale('en');

echo $blog->name; // English translation
```

---

### 5. Updating translations:

[](#5-updating-translations)

```
$blog->update([
    'name' => [
        'en' => 'Updated title',
        'tr' => 'Güncellenmiş Başlık'
    ]
]);
```

The package automatically preserves the old value:

```
name_old1 => 'Previous value'

```

Multiple updates:

```
name_old1
name_old2
name_old3
...

```

---

### 6. Get RAW stored filename (ID/UUID):

[](#6-get-raw-stored-filename-iduuid)

```
$blog->getRawOriginal('name');
```

Example output:

```
34

```

---

### 7. Fallback logic:

[](#7-fallback-logic)

When reading translation:

1. If lang file exists, return `$translations[$key]`
2. Else, return DB value
3. Else, return `null`

---

Database Table (`profscode_translates`)
---------------------------------------

[](#database-table-profscode_translates)

ColumnTypeDescriptionidINTPrimarytranslatable\_typeStringModel classtranslatable\_idCharWorks with ID or UUIDlocaleStringe.g. “tr”, “en”keyStringAttribute namevalueTextTranslated content---

How It Works
------------

[](#how-it-works)

### On Create:

[](#on-create)

- UUID is generated
- Translations saved into lang files + database
- Row inserted
- Real ID is assigned by DB
- UUID → ID rename is triggered
- Final translations stored as: `/lang/{locale}/{Model}/{id}.php`

### On Update:

[](#on-update)

- Old translations are stored as `key_oldX`
- New translation replaces main key
- No rename happens (ID does not change)
- History fully preserved

### On Read:

[](#on-read)

- Trait intercepts property access using `__get`
- Returns translation based on current locale

---

Example Lang File
-----------------

[](#example-lang-file)

`/lang/tr/Blog/12.php`:

```
return [
    'name_old1' => 'Eski Başlık',
    'name'      => 'Yeni Başlık',
    'description' => 'Açıklama'
];
```

---

License
-------

[](#license)

MIT © Profscode

---

Support
-------

[](#support)

For issues, please open a GitHub Issue.

###  Health Score

38

—

LowBetter than 83% of packages

Maintenance69

Regular maintenance activity

Popularity7

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity59

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% 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 ~9 days

Total

9

Last Release

183d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/2a222ca8933c72c3fc3715d66edac5ea7450656a7051af0b0a408b968ab6ac12?d=identicon)[YamanHafez](/maintainers/YamanHafez)

---

Top Contributors

[![YamanHafez](https://avatars.githubusercontent.com/u/88431093?v=4)](https://github.com/YamanHafez "YamanHafez (10 commits)")

### Embed Badge

![Health badge](/badges/profscode-translatable/health.svg)

```
[![Health](https://phpackages.com/badges/profscode-translatable/health.svg)](https://phpackages.com/packages/profscode-translatable)
```

###  Alternatives

[typicms/base

A modular multilingual CMS built with Laravel, enabling developers to manage structured content like pages, news, events, and more.

1.6k20.4k](/packages/typicms-base)[statamic-rad-pack/runway

Eloquently manage your database models in Statamic.

135224.7k7](/packages/statamic-rad-pack-runway)[ecotone/laravel

Ecotone for Laravel — CQRS, Event Sourcing, Sagas, Durable Workflows, and Outbox on top of Laravel Queue, via PHP attributes.

21318.6k3](/packages/ecotone-laravel)

PHPackages © 2026

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