Get started with 33% off your first certification using code: 33OFFNEW

How to localize Laravel routes

3 min read
Published on 4th July 2024

Creating a multilingual website involves more than just translating text. To fully support multiple languages, you also need to localise your routes. Laravel, a popular PHP framework, provides robust support for localization, including route localization. This article will guide you through the process of localising routes in Laravel, ensuring your application can serve users in their preferred languages.

Prerequisites

Before we begin, ensure you have the following:

  • A Laravel application set up. If you haven't set up a Laravel project yet, you can follow the Laravel installation guide.
  • Basic understanding of Laravel routing and middleware.

Step 1: Setting Up Localization Configuration

Laravel’s localization configuration is stored in the config/app.php file. Here, you can define the default locale and available locales for your application.

Configuring Locales

Open config/app.php and set the locale and fallback_locale options:

'locale' => 'en',
'fallback_locale' => 'en',

Next, define the supported locales. You can add this configuration at the end of the config/app.php file:

'supported_locales' => ['en', 'fr', 'de'],

Step 2: Creating Translation Files

Laravel uses translation files stored in the resources/lang directory. Each language should have its own subdirectory with translation files.

Example Translation Files

Create directories for each language you want to support:

mkdir -p resources/lang/en
mkdir -p resources/lang/fr
mkdir -p resources/lang/de

Inside each language directory, create a routes.php file for route translations:

// resources/lang/en/routes.php
return [
    'welcome' => 'welcome',
];

// resources/lang/fr/routes.php
return [
    'welcome' => 'bienvenue',
];

// resources/lang/de/routes.php
return [
    'welcome' => 'willkommen',
];

Step 3: Defining Localized Routes

Now, let’s define the localized routes in the routes/web.php file. Laravel does not provide native support for route localization, so you need to implement it manually or use a package like mcamara/laravel-localization.

Installing the Laravel Localization Package

To simplify the localization process, you can use the mcamara/laravel-localization package:

composer require mcamara/laravel-localization

Publish the configuration file:

php artisan vendor:publish --provider="Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider"

Configuring the Package

Open config/laravellocalization.php and set the supported locales:

'supportedLocales' => [
    'en' => ['name' => 'English'],
    'fr' => ['name' => 'French'],
    'de' => ['name' => 'German'],
],

Defining Routes with Localization

In routes/web.php, wrap your routes with the LaravelLocalization middleware:

use Mcamara\LaravelLocalization\Facades\LaravelLocalization;

Route::group(['prefix' => LaravelLocalization::setLocale(), 'middleware' => ['localeSessionRedirect', 'localizationRedirect', 'localeViewPath']], function () {
    Route::get(LaravelLocalization::transRoute('routes.welcome'), function () {
        return view('welcome');
    })->name('welcome');
});

Step 4: Using Localized Routes in Views

To generate URLs for localized routes in your views, use the localize_url helper function provided by the laravel-localization package.

<a href="{{ LaravelLocalization::localizeUrl(route('welcome')) }}">
    @lang('routes.welcome')
</a>

This ensures that the URLs are correctly localized based on the current language.

Step 5: Middleware for Language Detection

To automatically detect and set the user's preferred language, you can create middleware that checks the Accept-Language header or a query parameter.

Creating Middleware

Generate middleware using Artisan:

php artisan make:middleware SetLocale

Implementing Middleware Logic

Open app/Http/Middleware/SetLocale.php and implement the logic to set the locale:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Session;

class SetLocale
{
    public function handle($request, Closure $next)
    {
        if (Session::has('locale')) {
            $locale = Session::get('locale');
        } else {
            $locale = $request->getPreferredLanguage(Config::get('app.supported_locales'));
            Session::put('locale', $locale);
        }

        App::setLocale($locale);

        return $next($request);
    }
}

Register the middleware in app/Http/Kernel.php:

protected $middlewareGroups = [
    'web' => [
        // other middlewares...
        \App\Http\Middleware\SetLocale::class,
    ],
];

Final take

Localizing routes in Laravel enhances the user experience by providing content in the user’s preferred language. By configuring localization settings, creating translation files, defining localized routes, and using middleware to detect the user's language, you can build a multilingual Laravel application efficiently.

For more details, refer to the official documentation:

By following these steps, you can ensure that your Laravel application is fully localized, providing a seamless experience for users around the world.