Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Locales Laravel Package

chinleung/laravel-locales

Add multi-locale support to Laravel with simple config and helper functions. Define supported locales via app.locales or a published config, and use locale() to get/set the current locale and locales() to get/set supported locales.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps

  1. Installation:

    composer require chinleung/laravel-locales
    

    For Laravel 13 projects, ensure version ^3.0 is specified.

  2. Publish Configuration:

    php artisan vendor:publish --provider="ChinLeung\LaravelLocales\LaravelLocalesServiceProvider" --tag="config"
    

    This generates config/locales.php with default settings.

  3. Update config/app.php: Add your supported locales to the locales array:

    'locales' => ['en', 'fr', 'es', 'zh'],
    
  4. First Use Case: Dynamically set and retrieve the current locale in a controller or Blade template:

    // Set locale
    locale('fr');
    
    // Get current locale
    $currentLocale = locale(); // 'fr'
    

Implementation Patterns

Core Workflows

  1. Locale Switching in Controllers:

    use ChinLeung\LaravelLocales\Facades\Locales;
    
    public function switchLocale($locale)
    {
        if (in_array($locale, Locales::getSupportedLocales())) {
            Locales::setLocale($locale);
            return redirect()->back();
        }
        abort(400, 'Unsupported locale');
    }
    
  2. Middleware Integration: Register the locale middleware in app/Http/Kernel.php:

    protected $middlewareGroups = [
        'web' => [
            // ...
            \ChinLeung\LaravelLocales\Middleware\SetLocale::class,
        ],
    ];
    

    Configure the middleware in config/locales.php:

    'middleware' => [
        'default' => 'en',
        'cookie' => 'locale',
        'header' => 'X-Locale',
    ],
    
  3. Route Localization: Use the locale middleware in route groups:

    Route::middleware(['locale'])->group(function () {
        Route::get('/blog', [BlogController::class, 'index']);
    });
    
  4. Blade Helpers:

    <!-- Display current locale -->
    <p>Current locale: {{ locale() }}</p>
    
    <!-- Generate localized URLs -->
    <a href="{{ localized_url('blog', 'fr') }}">Blog (FR)</a>
    
  5. Dynamic Locale Detection: Override the default locale logic in a service provider:

    public function boot()
    {
        Locales::macro('detectLocale', function () {
            return request()->ip() === '123.45.67.89' ? 'zh' : 'en';
        });
    }
    

Integration Tips

  • Localization Middleware: Combine with spatie/laravel-translatable for content localization by extending the middleware logic.
  • Fallback Logic: Configure fallback locales in config/locales.php:
    'fallback_locale' => 'en',
    
  • Testing: Use the locales() helper to mock supported locales in tests:
    locales(['en', 'fr']);
    $this->assertEquals(['en', 'fr'], Locales::getSupportedLocales());
    

Gotchas and Tips

Pitfalls

  1. Middleware Overrides: If you use custom middleware that modifies $request->locale, it may conflict with the package’s SetLocale middleware. Ensure sequencing in app/Http/Kernel.php:

    protected $middlewarePriority = [
        \ChinLeung\LaravelLocales\Middleware\SetLocale::class,
        // Other middleware...
    ];
    
  2. Associative Arrays in Config: The package supports associative arrays for locales (e.g., ['en' => 'English']), but this can cause issues with route generation. Stick to simple arrays unless explicitly needed:

    // Avoid unless necessary
    locales(['en' => 'English', 'fr' => 'Français']);
    
  3. Session vs. Cookie Persistence: By default, the package uses cookies to store locale preferences. If you rely on sessions, ensure config/locales.php is configured to use session storage:

    'middleware' => [
        'cookie' => false,
        'session' => true,
    ],
    
  4. Route Caching: Clear route cache after adding/removing locales:

    php artisan route:clear
    
  5. Laravel 13 Specifics:

    • The package uses Laravel’s new app() facade macros. Ensure your project’s AppServiceProvider doesn’t override these.
    • Test with Laravel’s new bootstrap/app.php configuration if you encounter bootstrapping issues.

Debugging

  • Locale Not Updating?: Check if the middleware is registered and the locale cookie/session is being set. Use:

    dd(request()->cookie('locale')); // For cookie storage
    dd(session('locale')); // For session storage
    
  • Unsupported Locale Errors: Verify the locale is in the app.locales array or set via locales() helper. Use:

    dd(Locales::getSupportedLocales());
    
  • Route Localization Issues: Ensure route groups with the locale middleware are properly structured. Test with:

    php artisan route:list
    

Extension Points

  1. Custom Locale Detection: Extend the Locales facade to add custom logic:

    Locales::extend('custom', function () {
        return request()->header('Accept-Language') ?: config('app.locale');
    });
    
  2. Dynamic Locale Switching: Create a custom request macro to handle locale switching:

    use Illuminate\Http\Request;
    
    Request::macro('setLocale', function ($locale) {
        if (in_array($locale, Locales::getSupportedLocales())) {
            Locales::setLocale($locale);
            return true;
        }
        return false;
    });
    
  3. Locale-Aware Redirects: Override the redirect() method in a service provider:

    public function boot()
    {
        \Illuminate\Support\Facades\Redirect::macro('localized', function ($path, $locale = null) {
            $locale = $locale ?: Locales::getLocale();
            return redirect()->to($locale . '/' . ltrim($path, '/'));
        });
    }
    

Configuration Quirks

  • Priority Order: The locales() helper takes precedence over app.locales. Override carefully:

    locales(['en', 'fr']); // Temporarily overrides app.locales
    
  • Default Locale: The package defaults to 'en'. Change it in config/app.php:

    'locale' => 'fr',
    
  • Middleware Configuration: The SetLocale middleware checks for locales in this order:

    1. Route parameter (e.g., /{locale}/blog).
    2. Cookie (locale).
    3. Session (locale).
    4. Request header (X-Locale).
    5. Fallback to app.locale.

Performance Tips

  • Avoid Repeated Calls: Cache the result of Locales::getSupportedLocales() if called frequently:

    $locales = cache()->remember('supported_locales', now()->addHours(1), function () {
        return Locales::getSupportedLocales();
    });
    
  • Minimize Middleware Overhead: Only apply the locale middleware to route groups that need it, not globally.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle
atriumphp/atrium
sandermuller/package-boost-laravel
sandermuller/boost-skills
redaxo/core
yusufgenc/filament-api-forge
l3aro/rating-star-for-filament
leek/filament-subtenant-scope
anil/file-picker
broqit/fields-ai