vershub / laraveltranslations
laravel package for translatable models
Installs: 40
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/vershub/laraveltranslations
Requires
- php: >=8.2
This package is auto-updated.
Last update: 2025-12-23 17:07:52 UTC
README
Laravel Translations
This lightweight Laravel package enables you to eager load models along with their translations in the specified language, efficiently preventing the N+1 query problem. Additionally, it allows you to retrieve a single translation (instead of an array) without unnecessarily loading extra models into memory..
🚀 Installation
Install the package via Composer:
composer require vershub/laraveltranslations
🛠️ Usage
1. Create a Translatable Model
Extend the TranslatableModel class and implement the required abstract methods:
namespace App\Models; use Vershub\LaravelTranslations\TranslatableModel; class CarBrand extends TranslatableModel { protected $fillable = ['name']; protected function getTranslationModel(): string { return CarBrandTranslation::class; } protected function getForeignKeyForTranslation(): string { return 'car_brand_id'; } }
2. Create a Translation Model
The translation model should be a standard Eloquent model:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class CarBrandTranslation extends Model { protected $fillable = ['locale_code', 'name', 'description']; }
Example of translation table migration:
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateCarBrandTranslationsTable extends Migration { public function up() { Schema::create('car_brand_translations', function (Blueprint $table) { $table->id(); $table->foreignId('car_brand_id')->constrained()->cascadeOnDelete(); $table->string('locale_code'); $table->string('name'); $table->text('description')->nullable(); $table->timestamps(); }); } public function down() { Schema::dropIfExists('car_brand_translations'); } }
3. Use the withTranslation Scope
Retrieve translations for the current locale
use App\Models\CarBrand; $carBrands = CarBrand::withTranslation()->get(); foreach ($carBrands as $carBrand) { echo $carBrand->translation->name; }
Retrieve translations for a specific locale
use App\Models\CarBrand; $carBrands = CarBrand::withTranslation('fr')->get(); foreach ($carBrands as $carBrand) { echo $carBrand->translation->name; }
Select specific columns from translations table
use App\Models\CarBrand; $carBrands = CarBrand::withTranslation('fr:id,locale_code,name,description')->get();
⚙️ Customization
Override the Locale Code Column
By default, the package uses locale_code. You can change this by publishing the config file and change the value of locale_code_column key:
return [ 'locale_code_column' => 'locale_code' ];