Start · Sprachen · PHP · Referenz · locale_accept_from_http

locale_accept_from_http

Funktion

Ermittelt das beste verfügbare Locale anhand des HTTP-Accept-Language-Headers und gibt es als IETF-Sprach-Tag zurück.

seit PHP 5.3.0 Kategorie: string

Signatur

locale_accept_from_http(string $header): string|false

Beschreibung

locale_accept_from_http() analysiert den Wert des HTTP-Headers Accept-Language und gibt das beste passende Locale als IETF-Sprach-Tag (z. B. de_DE) zurück. Die Funktion ist ein prozeduraler Alias von Locale::acceptFromHttp() aus der intl-Extension.

Typischerweise wird der Header-Wert aus $_SERVER['HTTP_ACCEPT_LANGUAGE'] entnommen. Der Browser sendet darin eine priorisierte Liste bevorzugter Sprachen (z. B. de-DE,de;q=0.9,en-US;q=0.8). Die Funktion wertet die q-Gewichtungen aus und gibt das am höchsten priorisierte, syntaktisch gültige Locale zurück.

Der Rückgabewert kann anschließend mit locale_set_default() als Standard-Locale gesetzt oder für die Auswahl von Übersetzungsdateien genutzt werden. Dies ist der empfohlene Weg, um die Sprache einer Webanwendung automatisch an die Browser-Einstellungen des Nutzers anzupassen.

Die Funktion erfordert die PHP-Extension intl (ICU-basiert) und ist nicht ohne diese verfügbar. Sie validiert den Header-Wert nach RFC 4647 und gibt false zurück, wenn der übergebene String kein gültiger Accept-Language-Wert ist.

Parameter

Name Typ Default Beschreibung
$header Pflicht string Der vollständige Wert des HTTP-Headers Accept-Language, z. B. aus $_SERVER['HTTP_ACCEPT_LANGUAGE']. Muss einem gültigen RFC-4647-Format entsprechen, andernfalls wird false zurückgegeben.

Rückgabewert

Typ
string|false
Beschreibung
Gibt das beste passende Locale als IETF-Sprach-Tag (z. B. de_DE, en_US) zurück. Gibt false zurück, wenn der übergebene Header-Wert ungültig ist oder kein Locale ermittelt werden konnte.

Beispiele

Sprache aus Browser-Header automatisch ermitteln

<?php
// Typische Verwendung: Browser-Sprache aus dem HTTP-Request auslesen
$acceptLanguage = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? 'en-US';

$locale = locale_accept_from_http($acceptLanguage);

if ($locale !== false) {
    locale_set_default($locale);
    echo 'Erkanntes Locale: ' . $locale;
} else {
    echo 'Kein gültiges Locale gefunden, Fallback wird verwendet.';
    locale_set_default('de_DE');
}
Erkanntes Locale: de_DE

Übersetzungsdatei anhand des ermittelten Locales laden

<?php
// Accept-Language-Header mit mehreren Sprachen und Gewichtungen
$header = 'fr-CH, fr;q=0.9, de;q=0.8, en;q=0.7';

$locale = locale_accept_from_http($header);

if ($locale !== false) {
    $language = locale_get_primary_language($locale);
    $translationFile = __DIR__ . '/lang/' . $language . '.php';

    if (file_exists($translationFile)) {
        require $translationFile;
        echo 'Übersetzungsdatei geladen: ' . $language . '.php';
    } else {
        echo 'Keine Übersetzung für: ' . $locale . ', nutze Standard.';
    }
} else {
    echo 'Ungültiger Accept-Language-Header.';
}
Übersetzungsdatei geladen: fr.php

// Wichtig · Fallstricke

Sicherheitshinweis: Der Wert von $_SERVER['HTTP_ACCEPT_LANGUAGE'] stammt direkt vom Client und ist grundsätzlich nicht vertrauenswürdig. Er sollte niemals ungeprüft in Dateinamen, Datenbankabfragen oder HTML-Ausgaben eingesetzt werden. Der Rückgabewert von locale_accept_from_http() selbst ist durch die ICU-Bibliothek normalisiert und sicher, jedoch sollte der raw Header-Wert niemals direkt weiterverwendet werden.

Die Funktion liefert das erste syntaktisch gültige Locale mit der höchsten Priorität – es prüft nicht, ob die Anwendung dieses Locale tatsächlich unterstützt. Ein eigener Abgleich mit den verfügbaren Sprachen der Anwendung ist daher notwendig.

Die intl-Extension muss aktiviert sein (extension=intl in der php.ini). Fehlt sie, führt der Aufruf zu einem fatalen Fehler.