Skip to content

kingscode/laravel-localize

Repository files navigation

Laravel Localize

Packagist Build status license Packagist

An as minimalistic as possible localization package, makes it so the app.locale is set to nl in the case of /nl/home.

Installation

Require the package.

composer require kingscode/laravel-localize

... and optionally publish the config.

php artisan vendor:publish --provider="KingsCode\LaravelLocalize\LocalizeServiceProvider"

Add the middleware to the needed middleware groups, in our case only to the web group.

<?php

namespace App\Http;

class Kernel extends HttpKernel
{
    ...

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            ...
            LocaleSelector::class,     // <<<<<< Here it is.
            SubstituteBindings::class, // Its best to register before substitute bindings.
            ...
        ],
    ];
    
    ...
}

Now you must register the route file that holds your localized routes, you will do this twice:

  • Once without a prefix and prefixed name.
  • Once with a prefix and prefixed name.

This makes it so that your default locale can use / instead of being forced to have /en when your website is english by default.

<?php

use Illuminate\Contracts\Config\Repository;
use Illuminate\Routing\Router;
use KingsCode\LaravelLocalize\Localize;

class RouteServiceProvider extends ServiceProvider
{
    public function map()
    {
        // Web routes without localization, like a "/file/{file}" route or such.
        $this->mapWebRoutes();
        
        // And as the last method call you'll do the localized web routes.
        $this->mapLocalizedWebRoutes();
    }
    
    /**
     * Define the localized "web" routes for the application.
     *
     * @return void
     */
    protected function mapLocalizedWebRoutes()
    {
        // We'll take stuff from the config to keep things easily configurable.
        // Not a must, but it prevents you from having to override stuff.
        $config = $this->app->make(Repository::class);
        
        // We'll need a router to register routes duh.
        $router = $this->app->make(Router::class);
        
        /** @var Localize $localize */
        $localize = $this->app->make(Localize::class);
        
        // Okay so here is an IMPORTANT part.
        // Register the {locale} routes first otherwise {locale}/{any} will not be reachable and {any} will catch everything.
        $router->middleware('web')
            ->namespace($this->namespace)
            ->prefix('{' . $config->get('localize.route_parameter_key') . '}') // We add the prefix.
            ->where([$config->get('localize.route_parameter_key') => $localize->getRouteRegex()])
            ->name($config->get('localize.route_name_prefix') . '.') // And the name prefix.
            ->group(base_path('routes/localized.web.php'));
        
        $router->middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/localized.web.php'));
    }
}