IntlPull
Tutorial
13 min read

Laravel Localization: Complete PHP i18n Guide for 2026

Master Laravel localization with lang files, __() helper, Blade directives, pluralization, JSON translations, and middleware. Complete PHP i18n guide for 2026.

IntlPull Team
IntlPull Team
Feb 12, 2026
On this page
Summary

Master Laravel localization with lang files, __() helper, Blade directives, pluralization, JSON translations, and middleware. Complete PHP i18n guide for 2026.

Laravel localization provides a comprehensive framework for building multilingual PHP applications with elegant syntax and powerful features integrated directly into the framework. Laravel's translation system uses language files stored in lang/ directory, supporting both PHP arrays and JSON formats for organizing translatable strings. The __() helper function and @lang Blade directive enable seamless string retrieval with support for parameter replacement, pluralization rules, and nested translation keys. Laravel automatically handles locale detection through middleware that checks session data, cookies, and browser preferences, while allowing programmatic locale switching via the App::setLocale() facade. The framework includes sophisticated pluralization supporting multiple plural forms across different languages following Unicode CLDR rules, along with built-in helpers for formatting dates, numbers, and currency values according to regional conventions. Advanced features include validation message localization, pagination text translation, and email notification internationalization. Laravel's translation system integrates smoothly with popular packages like laravel-translatable for Eloquent model translation and spatie/laravel-translation-loader for database-driven translations. This guide covers Laravel localization from basic configuration through advanced patterns including route localization, Livewire compatibility, API internationalization, and continuous integration workflows for managing translations across development teams.

Laravel Localization Architecture

Laravel's translation system operates through a hierarchical file-based structure that organizes translations by locale and namespace, providing flexibility for both simple and complex multilingual applications.

The translation layer sits atop Laravel's IlluminateTranslationTranslator class, which handles locale management, fallback languages, and message retrieval. When you request a translation using __() or trans(), Laravel follows this resolution process:

  1. Locale Detection: Determine active locale from application config, session, or explicit setting
  2. Key Parsing: Parse translation key (e.g., messages.welcome) into file and path
  3. File Loading: Load corresponding lang file (lang/es/messages.php)
  4. Key Resolution: Traverse array structure to find translation string
  5. Fallback: If not found, check fallback locale (typically English)
  6. Parameter Replacement: Substitute placeholders with provided values

Laravel supports two translation file formats:

PHP Array Files (lang/{locale}/{file}.php): Structured translations with nested keys, ideal for organized namespacing and complex applications. These files return associative arrays.

JSON Files (lang/{locale}.json): Flat key-value pairs using the default language string as the key, perfect for simple string replacement and rapid prototyping.

The framework automatically caches translation files in production for optimal performance, only reloading when cache is cleared or files change in development mode.

Initial Laravel Localization Setup

Configure localization in your Laravel application's configuration files.

Basic Configuration

PHP
1// config/app.php
2
3return [
4    // Default application locale
5    'locale' => 'en',
6
7    // Fallback locale when translation missing
8    'fallback_locale' => 'en',
9
10    // Available locales (custom config)
11    'available_locales' => [
12        'en' => 'English',
13        'es' => 'Spanish',
14        'fr' => 'French',
15        'de' => 'German',
16    ],
17];

Directory Structure

Create language file directories:

Terminal
1mkdir -p lang/en
2mkdir -p lang/es
3mkdir -p lang/fr
4mkdir -p lang/de

The complete structure:

lang/
├── en/
│   ├── auth.php
│   ├── messages.php
│   ├── validation.php
│   └── passwords.php
├── es/
│   ├── auth.php
│   ├── messages.php
│   └── validation.php
├── fr/
│   └── messages.php
├── en.json
├── es.json
└── fr.json

Creating Translation Files

PHP array format:

PHP
1// lang/en/messages.php
2
3return [
4    'welcome' => 'Welcome to our application',
5    'hello' => 'Hello, :name!',
6    'items' => '{0} No items|{1} One item|[2,*] :count items',
7
8    'user' => [
9        'profile' => 'User Profile',
10        'settings' => 'Account Settings',
11        'logout' => 'Log Out',
12    ],
13];

Spanish translation:

PHP
1// lang/es/messages.php
2
3return [
4    'welcome' => 'Bienvenido a nuestra aplicación',
5    'hello' => '¡Hola, :name!',
6    'items' => '{0} Sin artículos|{1} Un artículo|[2,*] :count artículos',
7
8    'user' => [
9        'profile' => 'Perfil de Usuario',
10        'settings' => 'Configuración de Cuenta',
11        'logout' => 'Cerrar Sesión',
12    ],
13];

JSON format:

JSON
1// lang/es.json
2{
3    "Welcome to our application": "Bienvenido a nuestra aplicación",
4    "Hello!": "¡Hola!",
5    "Log Out": "Cerrar Sesión"
6}

Translation Helper Functions

Laravel provides multiple helper functions for retrieving translations.

Basic Translation

PHP
1<?php
2
3namespace AppHttpControllers;
4
5class HomeController extends Controller
6{
7    public function index()
8    {
9        // Using __() helper (recommended)
10        $welcome = __('messages.welcome');
11
12        // Using trans() helper (alternative)
13        $hello = trans('messages.hello');
14
15        // JSON translation (string as key)
16        $logout = __('Log Out');
17
18        return view('home', [
19            'welcome' => $welcome,
20            'hello' => $hello,
21            'logout' => $logout,
22        ]);
23    }
24}

Parameter Replacement

PHP
1// Simple replacement
2$greeting = __('messages.hello', ['name' => 'Alice']);
3// Returns: "Hello, Alice!"
4
5// Multiple parameters
6$message = __('messages.order_complete', [
7    'order' => '#12345',
8    'total' => '$99.99',
9]);
10
11// In translation file:
12// 'order_complete' => 'Order :order completed. Total: :total'

Pluralization

PHP
1// Using trans_choice() or __() with count
2$apples = trans_choice('messages.apples', 0);  // "no apples"
3$apples = trans_choice('messages.apples', 1);  // "one apple"
4$apples = trans_choice('messages.apples', 5);  // "5 apples"
5
6// With count parameter
7$items = __('messages.items', ['count' => 3]);
8
9// Translation file:
10// 'apples' => '{0} no apples|{1} one apple|[2,*] :count apples'

Checking Translation Existence

PHP
1use IlluminateSupportFacadesLang;
2
3if (Lang::has('messages.new_feature')) {
4    $message = __('messages.new_feature');
5} else {
6    $message = __('messages.default');
7}
8
9// Get translation or return default
10$text = Lang::get('messages.optional', [], 'en', false) ?? 'Default text';

Blade Template Directives

Laravel's Blade templating engine provides directives for localization.

Basic Translation

BLADE
1{{-- Simple translation --}}
2<h1>{{ __('messages.welcome') }}</h1>
3
4{{-- @lang directive (alternative) --}}
5<p>@lang('messages.user.profile')</p>
6
7{{-- JSON translation --}}
8<button>{{ __('Save Changes') }}</button>
9
10{{-- Short echo syntax --}}
11<span>@lang('messages.hello')</span>

With Parameters

BLADE
1{{-- Parameter replacement --}}
2<p>{{ __('messages.hello', ['name' => $user->name]) }}</p>
3
4{{-- Multiple parameters --}}
5<div>
6    {{ __('messages.welcome_user', [
7        'name' => $user->name,
8        'email' => $user->email,
9    ]) }}
10</div>

Pluralization in Blade

BLADE
1{{-- Using trans_choice --}}
2<p>{{ trans_choice('messages.items', $count) }}</p>
3
4{{-- With count parameter --}}
5<span>{{ __('messages.apples', ['count' => $appleCount]) }}</span>
6
7{{-- In loop --}}
8@foreach ($products as $product)
9    <div>
10        {{ trans_choice('messages.reviews', $product->reviews_count) }}
11    </div>
12@endforeach

Language Switcher Component

BLADE
1{{-- resources/views/components/language-switcher.blade.php --}}
2<div class="language-switcher">
3    <select onchange="window.location.href=this.value">
4        @foreach(config('app.available_locales') as $code => $name)
5            <option
6                value="{{ route('locale.switch', $code) }}"
7                {{ app()->getLocale() === $code ? 'selected' : '' }}
8            >
9                {{ $name }}
10            </option>
11        @endforeach
12    </select>
13</div>
14
15{{-- Usage --}}
16<x-language-switcher />

Conditional Content by Locale

BLADE
1@if(app()->getLocale() === 'es')
2    <p>Contenido específico para español</p>
3@elseif(app()->getLocale() === 'fr')
4    <p>Contenu spécifique au français</p>
5@else
6    <p>Default English content</p>
7@endif
8
9{{-- Or using Blade's @locale directive (Laravel 10+) --}}
10@locale('es')
11    <p>Contenido en español</p>
12@endlocale

Locale Detection and Middleware

Configure automatic locale detection based on user preferences.

Creating Locale Middleware

Terminal
php artisan make:middleware SetLocale
PHP
1<?php
2
3namespace AppHttpMiddleware;
4
5use Closure;
6use IlluminateHttpRequest;
7use IlluminateSupportFacadesApp;
8use IlluminateSupportFacadesSession;
9
10class SetLocale
11{
12    public function handle(Request $request, Closure $next)
13    {
14        // Priority: URL parameter > Session > Browser header > Default
15        $locale = $request->segment(1);
16
17        $availableLocales = array_keys(config('app.available_locales'));
18
19        if (in_array($locale, $availableLocales)) {
20            App::setLocale($locale);
21            Session::put('locale', $locale);
22        } elseif (Session::has('locale')) {
23            App::setLocale(Session::get('locale'));
24        } else {
25            // Detect from browser Accept-Language header
26            $locale = $request->getPreferredLanguage($availableLocales);
27            App::setLocale($locale);
28        }
29
30        return $next($request);
31    }
32}

Register in app/Http/Kernel.php:

PHP
1protected $middlewareGroups = [
2    'web' => [
3        // ... other middleware
4        AppHttpMiddlewareSetLocale::class,
5    ],
6];

Locale Switcher Controller

PHP
1<?php
2
3namespace AppHttpControllers;
4
5use IlluminateHttpRequest;
6use IlluminateSupportFacadesApp;
7use IlluminateSupportFacadesSession;
8
9class LocaleController extends Controller
10{
11    public function switch(Request $request, $locale)
12    {
13        $availableLocales = array_keys(config('app.available_locales'));
14
15        if (in_array($locale, $availableLocales)) {
16            Session::put('locale', $locale);
17            App::setLocale($locale);
18        }
19
20        return redirect()->back();
21    }
22}

Route definition:

PHP
1// routes/web.php
2use AppHttpControllersLocaleController;
3
4Route::get('/locale/{locale}', [LocaleController::class, 'switch'])
5    ->name('locale.switch');

User-Specific Locale

Store locale in user profile:

PHP
1<?php
2
3namespace AppHttpMiddleware;
4
5use Closure;
6use IlluminateHttpRequest;
7use IlluminateSupportFacadesApp;
8use IlluminateSupportFacadesAuth;
9
10class SetUserLocale
11{
12    public function handle(Request $request, Closure $next)
13    {
14        if (Auth::check() && Auth::user()->locale) {
15            App::setLocale(Auth::user()->locale);
16        }
17
18        return $next($request);
19    }
20}

Update user locale:

PHP
1// In user settings controller
2public function updateLocale(Request $request)
3{
4    $validated = $request->validate([
5        'locale' => 'required|in:en,es,fr,de',
6    ]);
7
8    $request->user()->update([
9        'locale' => $validated['locale'],
10    ]);
11
12    App::setLocale($validated['locale']);
13
14    return back()->with('success', __('Locale updated successfully'));
15}

Route Localization

Translate route URLs for better SEO and user experience.

Basic Route Prefixing

PHP
1// routes/web.php
2
3Route::prefix(app()->getLocale())->group(function () {
4    Route::get('/about', [PageController::class, 'about'])
5        ->name('about');
6    Route::get('/contact', [PageController::class, 'contact'])
7        ->name('contact');
8});
9
10// URLs: /en/about, /es/about, /fr/about

Translated Route Paths

Use translation files for route segments:

PHP
1// lang/en/routes.php
2return [
3    'about' => 'about',
4    'contact' => 'contact',
5    'products' => 'products',
6];
7
8// lang/es/routes.php
9return [
10    'about' => 'acerca-de',
11    'contact' => 'contacto',
12    'products' => 'productos',
13];
PHP
1// routes/web.php
2
3Route::prefix(app()->getLocale())->group(function () {
4    Route::get(__('routes.about'), [PageController::class, 'about'])
5        ->name('about');
6    Route::get(__('routes.contact'), [PageController::class, 'contact'])
7        ->name('contact');
8});
9
10// URLs: /en/about, /es/acerca-de, /fr/a-propos

Using mcamara/laravel-localization

Install popular localization package:

Terminal
composer require mcamara/laravel-localization

Configure:

PHP
1// config/laravellocalization.php (after publishing)
2
3'supportedLocales' => [
4    'en' => ['name' => 'English', 'script' => 'Latn', 'native' => 'English'],
5    'es' => ['name' => 'Spanish', 'script' => 'Latn', 'native' => 'Español'],
6    'fr' => ['name' => 'French', 'script' => 'Latn', 'native' => 'Français'],
7],

Use in routes:

PHP
1Route::group([
2    'prefix' => LaravelLocalization::setLocale(),
3    'middleware' => ['localeSessionRedirect', 'localizationRedirect', 'localeViewPath']
4], function() {
5    Route::get('/', [HomeController::class, 'index'])
6        ->name('home');
7    Route::get(LaravelLocalization::transRoute('routes.about'), [PageController::class, 'about'])
8        ->name('about');
9});

Pluralization Rules

Laravel supports sophisticated pluralization following Unicode CLDR standards.

Basic Pluralization

PHP
1// Translation file
2'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',
3
4// Usage
5echo trans_choice('messages.apples', 0);  // "There are none"
6echo trans_choice('messages.apples', 1);  // "There is one"
7echo trans_choice('messages.apples', 10); // "There are 10"

Range-Based Pluralization

PHP
1'minutes' => '{1} :value minute ago|[2,59] :value minutes ago|{60,*} over an hour ago',
2
3echo trans_choice('messages.minutes', 1, ['value' => 1]);   // "1 minute ago"
4echo trans_choice('messages.minutes', 30, ['value' => 30]); // "30 minutes ago"
5echo trans_choice('messages.minutes', 90, ['value' => 90]); // "over an hour ago"

Complex Language Rules

For languages with complex plural rules (e.g., Polish, Russian):

PHP
1// lang/pl/messages.php
2'apples' => '{0} brak jabłek|{1} :count jabłko|[2,4] :count jabłka|[5,*] :count jabłek',
3
4// Polish has different forms for 1, 2-4, and 5+
5echo trans_choice('messages.apples', 1);  // "1 jabłko"
6echo trans_choice('messages.apples', 3);  // "3 jabłka"
7echo trans_choice('messages.apples', 10); // "10 jabłek"

Custom Pluralization Logic

PHP
1use IlluminateSupportFacadesLang;
2
3Lang::choice('messages.custom', 5, [
4    'count' => 5,
5    'total' => 100,
6], 'es');

Validation Message Localization

Laravel automatically localizes validation messages.

Using Built-in Messages

PHP
1// lang/es/validation.php (included with Laravel)
2
3return [
4    'required' => 'El campo :attribute es obligatorio.',
5    'email' => 'El campo :attribute debe ser un correo electrónico válido.',
6    'min' => [
7        'string' => 'El campo :attribute debe tener al menos :min caracteres.',
8    ],
9
10    'attributes' => [
11        'email' => 'correo electrónico',
12        'password' => 'contraseña',
13        'name' => 'nombre',
14    ],
15];

Laravel automatically uses localized messages:

PHP
1$request->validate([
2    'email' => 'required|email',
3    'password' => 'required|min:8',
4]);
5
6// Spanish locale shows: "El campo correo electrónico es obligatorio."

Custom Validation Messages

PHP
1$request->validate([
2    'username' => 'required|unique:users',
3], [
4    'username.required' => __('validation.custom.username.required'),
5    'username.unique' => __('validation.custom.username.unique'),
6]);
7
8// In lang/es/validation.php
9'custom' => [
10    'username' => [
11        'required' => 'Debes proporcionar un nombre de usuario.',
12        'unique' => 'Este nombre de usuario ya está en uso.',
13    ],
14],

Livewire Localization

Integrate localization with Laravel Livewire components.

Basic Livewire Translation

PHP
1<?php
2
3namespace AppLivewire;
4
5use LivewireComponent;
6
7class ProductList extends Component
8{
9    public $searchTerm = '';
10
11    public function render()
12    {
13        return view('livewire.product-list', [
14            'title' => __('messages.products.title'),
15            'placeholder' => __('messages.products.search_placeholder'),
16        ]);
17    }
18}
BLADE
1{{-- resources/views/livewire/product-list.blade.php --}}
2<div>
3    <h2>{{ $title }}</h2>
4
5    <input
6        type="text"
7        wire:model.live="searchTerm"
8        placeholder="{{ $placeholder }}"
9    />
10
11    <button wire:click="search">
12        {{ __('Search') }}
13    </button>
14</div>

Reactive Locale Switching

PHP
1<?php
2
3namespace AppLivewire;
4
5use LivewireComponent;
6use IlluminateSupportFacadesApp;
7use IlluminateSupportFacadesSession;
8
9class LanguageSwitcher extends Component
10{
11    public $currentLocale;
12
13    public function mount()
14    {
15        $this->currentLocale = app()->getLocale();
16    }
17
18    public function switchLocale($locale)
19    {
20        $availableLocales = array_keys(config('app.available_locales'));
21
22        if (in_array($locale, $availableLocales)) {
23            Session::put('locale', $locale);
24            App::setLocale($locale);
25            $this->currentLocale = $locale;
26
27            // Emit event to refresh other components
28            $this->dispatch('locale-switched', locale: $locale);
29        }
30    }
31
32    public function render()
33    {
34        return view('livewire.language-switcher');
35    }
36}
BLADE
1{{-- Listening component --}}
2<div wire:key="product-{{ $product->id }}-{{ app()->getLocale() }}">
3    <h3>{{ __('messages.product.name') }}</h3>
4</div>
5
6<script>
7Livewire.on('locale-switched', () => {
8    // Reload page or refresh specific components
9    window.location.reload();
10});
11</script>

IntlPull Integration

Integrate Laravel with IntlPull for collaborative translation management.

Installation

Terminal
composer require intlpull/laravel
php artisan vendor:publish --provider="IntlPullLaravelIntlPullServiceProvider"

Configuration

PHP
1// config/intlpull.php
2
3return [
4    'project_id' => env('INTLPULL_PROJECT_ID'),
5    'api_key' => env('INTLPULL_API_KEY'),
6
7    'sync' => [
8        'enabled' => env('INTLPULL_SYNC_ENABLED', false),
9        'format' => 'json', // or 'php'
10        'languages' => ['es', 'fr', 'de'],
11    ],
12];
ENV
1# .env
2INTLPULL_PROJECT_ID=your-project-id
3INTLPULL_API_KEY=your-api-key
4INTLPULL_SYNC_ENABLED=true

Syncing Translations

Export to IntlPull:

Terminal
php artisan intlpull:push --language=es
php artisan intlpull:push --all

Import from IntlPull:

Terminal
php artisan intlpull:pull --language=es
php artisan intlpull:pull --all

Automated CI/CD Workflow

YAML
1# .github/workflows/translations.yml
2name: Sync Translations
3
4on:
5  schedule:
6    - cron: '0 2 * * *'  # Daily at 2 AM
7  workflow_dispatch:
8
9jobs:
10  sync:
11    runs-on: ubuntu-latest
12    steps:
13      - uses: actions/checkout@v3
14
15      - name: Setup PHP
16        uses: shivammathur/setup-php@v2
17        with:
18          php-version: '8.2'
19
20      - name: Install dependencies
21        run: composer install --no-interaction
22
23      - name: Pull translations
24        env:
25          INTLPULL_API_KEY: ${{ secrets.INTLPULL_API_KEY }}
26          INTLPULL_PROJECT_ID: ${{ secrets.INTLPULL_PROJECT_ID }}
27        run: php artisan intlpull:pull --all
28
29      - name: Create Pull Request
30        uses: peter-evans/create-pull-request@v5
31        with:
32          commit-message: 'chore: update translations from IntlPull'
33          title: 'Update translations'
34          branch: translations-update

Testing Localization

Ensure translations work correctly across all supported languages.

Feature Tests

PHP
1<?php
2
3namespace TestsFeature;
4
5use TestsTestCase;
6use IlluminateSupportFacadesApp;
7
8class LocalizationTest extends TestCase
9{
10    public function test_welcome_message_in_spanish()
11    {
12        App::setLocale('es');
13
14        $response = $this->get('/');
15
16        $response->assertSee('Bienvenido');
17    }
18
19    public function test_locale_switcher()
20    {
21        $response = $this->get('/locale/es');
22
23        $response->assertRedirect();
24        $this->assertEquals('es', session('locale'));
25    }
26
27    public function test_validation_messages_localized()
28    {
29        App::setLocale('es');
30
31        $response = $this->post('/register', [
32            'email' => 'invalid-email',
33        ]);
34
35        $response->assertSessionHasErrors(['email']);
36        $this->assertStringContainsString(
37            'correo electrónico válido',
38            session('errors')->first('email')
39        );
40    }
41}

Translation Coverage Check

PHP
1<?php
2
3namespace TestsUnit;
4
5use TestsTestCase;
6use IlluminateSupportFacadesFile;
7
8class TranslationCoverageTest extends TestCase
9{
10    public function test_all_languages_have_required_keys()
11    {
12        $baseLocale = 'en';
13        $testLocales = ['es', 'fr', 'de'];
14
15        $baseFiles = File::files(lang_path($baseLocale));
16
17        foreach ($testLocales as $locale) {
18            foreach ($baseFiles as $file) {
19                $filename = $file->getFilename();
20                $testFile = lang_path("$locale/$filename");
21
22                $this->assertFileExists(
23                    $testFile,
24                    "Missing translation file: $locale/$filename"
25                );
26
27                $baseKeys = require $file->getPathname();
28                $testKeys = require $testFile;
29
30                $this->assertSameSize(
31                    $baseKeys,
32                    $testKeys,
33                    "Translation count mismatch in $locale/$filename"
34                );
35            }
36        }
37    }
38}

Best Practices

1. Use JSON for Simple Translations

JSON
1// lang/es.json - Simple key-value pairs
2{
3    "Save": "Guardar",
4    "Cancel": "Cancelar",
5    "Delete": "Eliminar"
6}

2. Use PHP Arrays for Complex Structures

PHP
1// lang/es/messages.php - Organized namespaces
2return [
3    'auth' => [
4        'login' => 'Iniciar sesión',
5        'register' => 'Registrarse',
6        'failed' => 'Las credenciales son incorrectas.',
7    ],
8    'products' => [
9        'title' => 'Productos',
10        'add' => 'Agregar producto',
11    ],
12];

3. Always Use Named Parameters

PHP
1// ❌ Bad - positional parameters
2__('Welcome %s to %s', [$name, $site]);
3
4// ✅ Good - named parameters
5__('messages.welcome', ['name' => $name, 'site' => $site]);

4. Cache Translations in Production

Terminal
php artisan config:cache
php artisan route:cache
php artisan view:cache

5. Version Control JSON Files

JSON files are easier to merge than PHP arrays:

GITIGNORE
# .gitignore - Don't ignore translation files!
# lang/**/*.php
# lang/*.json

Production Deployment

Pre-Deployment Checklist

  • All language files present for supported locales
  • Translation coverage > 95% for launch languages
  • Validation messages localized
  • Email templates translated
  • Routes tested in all languages
  • Middleware configured correctly
  • Cache cleared and rebuilt
  • IntlPull sync configured

Deployment Commands

Terminal
1#!/bin/bash
2# deploy.sh
3
4# Pull latest translations
5php artisan intlpull:pull --all
6
7# Clear and rebuild caches
8php artisan config:clear
9php artisan route:clear
10php artisan view:clear
11php artisan cache:clear
12
13# Rebuild optimized caches
14php artisan config:cache
15php artisan route:cache
16php artisan view:cache
17
18# Run migrations
19php artisan migrate --force

Frequently Asked Questions

Q: Should I use JSON or PHP array translation files?

A: Use JSON for simple key-value translations (buttons, labels). Use PHP arrays for complex nested structures and when you need comments or logic. Many projects use both: JSON for UI strings, PHP for organized feature-specific translations.

Q: How do I handle database content translation?

A: Use packages like spatie/laravel-translatable or astrotomic/laravel-translatable for Eloquent models. These create separate columns (e.g., title_en, title_es) or separate translation tables.

Q: Can I change locale without page reload?

A: Yes, with Livewire or AJAX. Update session locale via POST request and refresh components. For SPAs, use API routes that return translations as JSON.

Q: How do I translate email notifications?

A: Laravel automatically uses the recipient's locale if set. Override locale() method in notification class or set App::setLocale() before sending.

Q: What's the difference between __() and trans()?

A: __() is shorter syntax and supports JSON files. trans() is the traditional helper. Both work identically for PHP array files. Use __() for modern Laravel applications.

Q: How do I localize Blade components?

A: Pass translated strings as props or use translation helpers inside component templates. Create locale-specific component variants for complex cases.

Q: Can I use Laravel localization with Inertia.js?

A: Yes, export translations to JavaScript using packages like laravel-vue-i18n or pass translations as props. Consider IntlPull's API for dynamic translation loading.

Q: How do I handle RTL languages?

A: Detect RTL locales (ar, he, fa) and apply RTL CSS. Use Blade conditionals: @if(app()->getLocale() === 'ar') dir="rtl" @endif or middleware to add dir attribute.

IntlPull streamlines Laravel localization workflows with automated translation sync, collaborative editing, and version control for translation files. Whether building a new Laravel application or internationalizing an existing project, proper localization ensures your application serves global audiences effectively. Start with Laravel's built-in translation system, integrate IntlPull for team collaboration, and follow best practices for maintainable multilingual PHP applications.

Tags
laravel
php
i18n
localization
blade
backend
web-framework
IntlPull Team
IntlPull Team
Engineering

Building tools to help teams ship products globally. Follow us for more insights on localization and i18n.