To add translations to Eloquent models in Laravel, you can use a package like Astrotomic Laravel Translatable, which makes it easy to handle translations for your Eloquent models.
Step 1: Install the Laravel Translatable Package
Run the following Composer command to install the Astrotomic Laravel Translatable package:
bash
1 |
composer require astrotomic/laravel-translatable |
Step 2: Publish the Configuration File (Optional)
If you want to customize the configuration of the package, you can publish the config file using the following command:
bash
1 |
php artisan vendor:publish --provider="Astrotomic\Translatable\TranslatableServiceProvider" |
This will create a translatable.php
configuration file in the config
directory.
Step 3: Configure Your Model to Be Translatable
To make a model translatable, you need to:
- Add the Translatable trait to your model.
- Specify the fields that will be translatable.
Let’s assume you have a Post
model and you want to make the title
and content
fields translatable.
In app/Models/Post.php
, update your model as follows:
php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Astrotomic\Translatable\Contracts\Translatable as TranslatableContract; use Astrotomic\Translatable\Translatable; class Post extends Model implements TranslatableContract { use Translatable; // Specify which attributes are translatable public $translatedAttributes = ['title', 'content']; // Any other model properties... } |
Step 4: Create a Translation Model and Migration
The translatable fields will be stored in a separate translations table, so you need to create a new model and migration for that. Let’s create the PostTranslation model.
Run the following command to generate a model and migration for translations:
bash
1 |
php artisan make:model PostTranslation -m |
In the PostTranslation
model (app/Models/PostTranslation.php
), define it as follows:
php
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class PostTranslation extends Model { public $timestamps = false; // Disable timestamps protected $fillable = ['title', 'content']; // Fillable attributes } |
In the migration file created (database/migrations/xxxx_xx_xx_create_post_translations_table.php
), update it to define the schema for the post_translations
table:
php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreatePostTranslationsTable extends Migration { public function up() { Schema::create('post_translations', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('post_id'); // Foreign key to posts $table->string('locale')->index(); // Locale for the translation $table->string('title'); $table->text('content'); // Ensure that the combination of post_id and locale is unique $table->unique(['post_id', 'locale']); $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade'); }); } public function down() { Schema::dropIfExists('post_translations'); } } |
Run the migration to create the necessary tables:
bash
1 |
php artisan migrate |
Step 5: Add Translations to Your Data
Now that everything is set up, you can add translations to your Post
model in different languages. Here’s an example of how you can create a post with translations in both English and French:
php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
use App\Models\Post; $post = new Post(); // Set default locale data (English) $post->translateOrNew('en')->title = 'Hello World'; $post->translateOrNew('en')->content = 'This is a post in English'; // Set French translation data $post->translateOrNew('fr')->title = 'Bonjour le monde'; $post->translateOrNew('fr')->content = 'Ceci est un post en français'; // Save the post along with translations $post->save(); |
Step 6: Retrieving Translations
When retrieving translations, the package automatically returns the model in the current application locale. You can change the locale dynamically or retrieve translations for a specific locale.
Example: Get Current Locale Translation
php
1 2 3 4 5 |
$post = Post::find(1); // Assume the app locale is 'en', this will return the English translation echo $post->title; // Output: "Hello World" echo $post->content; // Output: "This is a post in English" |
Example: Get Translation for a Specific Locale
php
1 2 3 4 5 |
$post = Post::find(1); // Assume the app locale is 'en', this will return the English translation echo $post->title; // Output: "Hello World" echo $post->content; // Output: "This is a post in English" |
Example: Get All Translations
php
1 2 3 4 5 6 7 8 |
$post = Post::find(1); // Get all translations for the post $translations = $post->translations; foreach ($translations as $translation) { echo $translation->locale . ': ' . $translation->title . '<br>'; } |
Step 7: Updating Translations
To update translations for a post, use the same method translateOrNew()
:
php
1 2 3 4 5 6 7 8 9 10 11 |
$post = Post::find(1); // Update the English translation $post->translateOrNew('en')->title = 'Updated Title'; $post->translateOrNew('en')->content = 'Updated content in English'; // Update the French translation $post->translateOrNew('fr')->title = 'Titre mis à jour'; $post->translateOrNew('fr')->content = 'Contenu mis à jour en français'; $post->save(); |
Step 8: Deleting Translations
To delete a translation, use the deleteTranslation()
method:
php
1 2 3 4 |
$post = Post::find(1); // Delete the French translation $post->deleteTranslations('fr'); |
Summary
You’ve successfully integrated Astrotomic Laravel Translatable into your Laravel project. Here’s a quick summary of the steps:
- Install the package via Composer.
- Add the Translatable trait to your model and define translatable attributes.
- Create a translation model and migration.
- Add translations when creating models.
- Retrieve and update translations easily using the package methods.
- Use
translateOrNew()
to handle the addition and update of translations.
- Laravel Breeze – Simple authentication starter kit
- Laravel Jetstream – Scaffolding for Laravel apps
- Laravel Passport – API authentication via OAuth2
- Laravel Sanctum – Simple API authentication
- Spatie Laravel Permission – Role and permission management
- Laravel Cashier – Subscription billing with Stripe
- Laravel Scout – Full-text search using Algolia
- Laravel Socialite – OAuth authentication (Google, Facebook, etc.)
- Laravel Excel – Excel import and export for Laravel
- Laravel Horizon – Redis queues monitoring
- Laravel Nova – Admin panel for Laravel
- Laravel Fortify – Backend authentication for Laravel
- Laravel Vapor – Serverless deployment on AWS
- Laravel Telescope – Debugging assistant for Laravel
- Laravel Dusk – Browser testing
- Laravel Mix – API for compiling assets
- Spatie Laravel Backup – Backup management
- Laravel Livewire – Building dynamic UIs
- Spatie Laravel Media Library – Manage media uploads
- Laravel Excel – Excel spreadsheet handling
- Laravel Debugbar – Debug tool for Laravel
- Laravel WebSockets – Real-time communication
- Spatie Laravel Sitemap – Generate sitemaps
- Laravel Spark – SaaS scaffolding
- Laravel Envoy – Task runner for deployment
- Spatie Laravel Translatable – Multilingual model support
- Laravel Backpack – Admin panel
- Laravel AdminLTE – Admin interface template
- Laravel Collective Forms & HTML – Simplified form and HTML generation
- Spatie Laravel Analytics – Google Analytics integration
- Laravel Eloquent Sluggable – Automatically create slugs
- Laravel Charts – Chart integration
- Laravel Auditing – Track changes in models
- Laravel JWT Auth – JSON Web Token authentication
- Laravel Queue Monitor – Monitor job queues
- Spatie Laravel Query Builder – Filter, sort, and include relationships in Eloquent queries
- Laravel Datatables – jQuery Datatables API
- Laravel Localization – Multilingual support for views and routes
- Laravel Acl Manager – Access control list manager
- Laravel Activity Log – Record activity in your app
- Laravel Roles – Role-based access control
- Spatie Laravel Tags – Tagging models
- Laravel Installer – CLI installer for Laravel
- Laravel Breadcrumbs – Generate breadcrumbs in Laravel
- Laravel Mailgun – Mailgun integration for Laravel
- Laravel Trustup Model History – Store model change history
- Laravel Deployer – Deployment automation tool
- Laravel Auth – Custom authentication guards
- Laravel CORS – Cross-Origin Resource Sharing (CORS) support
- Laravel Notifications – Send notifications through multiple channels
- Spatie Laravel Http Logger – Log HTTP requests
- Laravel Permission Manager – Manage permissions easily
- Laravel Stubs – Customize default stubs in Laravel
- Laravel Fast Excel – Speed up Excel exports
- Laravel Image – Image processing
- Spatie Laravel Backup Server – Centralize backups for Laravel apps
- Laravel Forge API – Manage servers through the Forge API
- Laravel Blade SVG – Use SVGs in Blade templates
- Laravel Ban – Ban/unban users from your application
- Laravel API Response – Standardize API responses
- Laravel SEO – Manage SEO meta tags
- Laravel Settings – Store and retrieve settings
- Laravel DOMPDF – Generate PDFs
- Laravel Turbo – Full-stack framework for building modern web apps
- Spatie Laravel Event Sourcing – Event sourcing implementation
- Laravel Jetstream Inertia – Jetstream’s Inertia.js integration
- Laravel Envoy Tasks – Task automation
- Laravel Likeable – Like/dislike functionality
- Laravel GeoIP – Determine visitor’s geographic location
- Laravel Country State City – Dropdowns for country, state, and city
- Laravel Hashids – Generate short unique hashes
- Laravel Repository – Repository pattern for Laravel
- Laravel UUID – UUID generation for models
- Spatie Laravel Medialibrary Pro – Enhanced media management
- Laravel Queue Monitor – Monitor Laravel job queues
- Laravel User Activity – Monitor user activity
- Laravel DB Snapshots – Create database snapshots
- Laravel Twilio – Twilio integration
- Laravel Roles – Role-based permission handling
- Laravel Translatable – Add translations to Eloquent models
- Laravel Teamwork – Manage teams in multi-tenant apps
- Laravel Full Text Search – Add full-text search to Laravel models
- Laravel File Manager – File and media management
- Laravel User Timezones – Automatically detect user time zones
- Laravel ChartsJS – Render charts with ChartsJS
- Laravel Stripe – Stripe API integration
- Laravel PDF Generator – PDF generation
- Laravel Elasticsearch – Elasticsearch integration
- Laravel Simple Qrcode – Generate QR codes
- Laravel Timezone – Manage timezones and conversions
- Laravel Collective API – API management for Laravel
- Laravel Rest API Boilerplate – REST API starter kit
- Laravel Multi Auth – Multi-authentication functionality
- Laravel Voyager – Admin panel for Laravel
- Laravel Voyager Database – Database manager for Voyager
- Laravel Categories – Handle categories for models
- Laravel Multitenancy – Multi-tenancy implementation
- Laravel Access Control – Advanced access control for users
- Laravel Menus – Menu management
- Laravel Translatable Routes – Multilingual route handling