Published on

TYPO3: Autolanguage detection with PSR-15

Authors

This post outlines a simple approach to detect a visitor’s preferred language and redirect to the appropriate site language using a PSR-15 middleware in TYPO3.

Middleware skeleton

<?php

declare(strict_types=1);

namespace Vendor\Site\Middleware;

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Psr\Http\Message\ResponseInterface;
use TYPO3\CMS\Core\Utility\GeneralUtility;

final class LanguageDetectionMiddleware implements MiddlewareInterface
{
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        $acceptLang = $request->getHeaderLine('Accept-Language');
        $preferred = substr($acceptLang, 0, 2) ?: 'en';

        // Map to site language base
        $map = [
            'de' => '/de/',
            'en' => '/en/',
        ];

        $target = $map[$preferred] ?? '/en/';

        // Example: redirect if we’re at root
        $uri = (string)$request->getUri();
        if (rtrim($uri, '/') === '') {
            return new \TYPO3\CMS\Core\Http\RedirectResponse($target, 302);
        }

        return $handler->handle($request);
    }
}

Register middleware

Configuration/RequestMiddlewares.php:

<?php
return [
  'frontend' => [
    'vendor/site/lang-detect' => [
      'target' => Vendor\Site\Middleware\LanguageDetectionMiddleware::class,
      'after' => [ 'typo3/cms-frontend/site' ],
    ],
  ],
];

Notes

  • Use robust language parsing and persist the user’s choice via cookie
  • Respect already localized URLs and avoid redirect loops
  • Consider geo-IP or user profile settings as a fallback

With a small middleware you can offer a more localized experience to your visitors.