laravel-set-locale-christian-doebler

Mehrsprachigkeit mit Laravel

Es ist keine Besonderheit, dass Kunden mehrsprachige Applikationen oder Sites benötigen. Einige CMS bieten Mehrsprachigkeit direkt an. Wenn es jedoch beispielsweise eine Sonderlösung aus Applikation und Web-Site sein soll, ist aufgrund der Komplexität unter Umständen eine komplette Neuprogrammierung sinnvoll. Laravel, als eines der meist verwendeten und beliebtesten PHP-Frameworks, bietet die wichtigsten Bausteine für Applikation und Web-Site direkt an. Die Mehrsprachigkeit kann einfach, durch Laravels Middlewares, wie folgt nachimplementiert werden.

Im folgenden Beispiel möchten wir lediglich eine deutsche und eine englische Version des Produktes. Hierfür verwenden wir, wie soeben erwähnt, eine Middleware, um die Sprache des aktuellen Requests zu ermitteln.

Die Middleware wird einfach durch Laravels artisan-Kommando erzeugt...

$ php artisan make:middleware SetLocaleMiddlewareINFO  Middleware [app/Http/Middleware/SetLocaleMiddleware.php] created successfully.

...und anschließend in bootstrap/app.php registriert:

->withMiddleware(function (Middleware $middleware) {    // ...    $middleware->append(App\Http\Middleware\SetLocaleMiddleware::class);    // ...})

Damit wäre der erste Schritt bereits erledigt. Nun füttern wir die Middleware mit Anweisungen, sodass die gewünschte Sprache ermittelt werden kann. Hierfür wird der folgende Code in unsere neue Datei SetLocaleMiddleware.php eingefügt. Wichtig zu erwähnen ist, dass im aktuellen Beispiel als Standardsprache, in der Laravel-Konfiguration, Englisch verwendet wird.

public function handle(Request $request, Closure $next): Response{    $uri = $request->getRequestUri();    if ($uri === '/de' || str_starts_with($uri, '/de/')) {        app()->setLocale('de');    } elseif ($uri !== '/en' && !str_starts_with($uri, '/en/')) {        $acceptLanguage = $request->header('Accept-Language', app()->getLocale());        if (str_starts_with($acceptLanguage, 'de')) {            app()->setLocale('de');        }    }    return $next($request);}

Damit beim Besuch der Startseite der Site direkt auf die passende Sprache weitergeleitet wird, ändern wir unsere routes/web.php wie folgt ab:

Route::get('/', function () {    return response()->redirectTo(app()->getLocale());});

Somit wird beim Besuch der Basis-URL die in unserer Middleware ermittelte und gespeicherte Sprache abgerufen und die Besucher werden direkt auf die passende Sprachseite weitergeleitet, wie durch den Browser im request header Accept-Language angegeben wurde. Sofern die Sprache nicht in der Middleware gefunden wurde, wird automatisch auf die Standardsprache weitergeleitet. In diesem Fall also auf die englische Version.

Mit diesem Setup können nun auch ganz einfach per __() Übersetzungen ausgegeben werden. Wo auch immer Zugriff auf die aktuelle Sprache notwendig wird, kann diese mit app()->getLocale() abgerufen werden.

Viel Spaß beim Übersetzen!