candeno / laravel-translations
EAV-based per-locale translations for Eloquent models — stores translated field values in a shared translations table with a HasTranslations trait for get/set/bulk-write operations.
1.0.0
2026-04-24 11:28 UTC
Requires
- php: ^8.2
- illuminate/database: ^11.0|^12.0
- illuminate/support: ^11.0|^12.0
Requires (Dev)
- orchestra/testbench: ^9.0|^10.0
- phpunit/phpunit: ^11.0
README
EAV-based per-locale translations for Eloquent models. Stores translated field values in a shared translations table with a HasTranslations trait for get/set/bulk-write operations.
Installation
composer require candeno/laravel-translations
Publish and run the migration:
php artisan vendor:publish --tag=candeno-translations-migrations php artisan migrate
Usage
Add the trait to any Eloquent model:
use Candeno\LaravelTranslations\Concerns\HasTranslations; class Activity extends Model { use HasTranslations; protected array $translatable = ['title', 'subtitle', 'why_text']; }
Get a translation
// Falls back: requested locale → fallback locale → raw model attribute $activity->getTranslation('title', 'uk', 'da');
Set a translation
$activity->setTranslation('title', 'uk', 'Назва');
Set all locales for a field
$activity->setTranslations('title', [ 'da' => 'Titel', 'uk' => 'Назва', ]);
Bulk-write from a localizedContent map
Useful when consuming the automation form payload directly:
// $localizedContent = ['da' => ['title' => '...', 'description' => '...'], 'uk' => [...]] $activity->setLocalizedContent($localizedContent, [ 'title' => 'title', 'description' => 'subtitle', 'buttonText' => 'action_label', ]);
Schema
| column | type | notes |
|---|---|---|
table_name |
varchar |
Eloquent model table |
row_id |
varchar |
Model primary key (int or UUID) |
locale |
varchar(10) |
e.g. da, uk, en |
field |
varchar |
Model field name |
value |
text |
Translated value |
A unique index on (table_name, row_id, locale, field) ensures upserts are safe.