PHP langsys/langsys-php

Das PHP-Basis-SDK: ein Client für jede PHP-App – ob reines PHP, Framework, Worker oder CLI. Die Phrase in Ihrem Code ist zugleich Lookup-Schlüssel und Standardtext in der Basissprache – keine Schlüsseldatei, kein Extraktionsschritt. Die Übersetzung erfolgt auf dem Server, sodass die Seite bereits lokalisiert ankommt.

Backend-SDK, daher gibt es auf dieser Seite keinen Playground im Browser – der Browser kann kein PHP ausführen. Sie verwenden Laravel? Das Laravel-Paket umhüllt diesen Client mit einer Blade-Direktive, einer Middleware und einer Facade. Vollständige Referenz: die README.

Sie verwenden einen KI-Coding-Agenten? Geben Sie ihm diesen Prompt
Add Langsys translation to this PHP app.

1. Read https://docs.langsys.dev/llms.txt, then follow
   https://docs.langsys.dev/learn/sdk/php/ for the install and setup.
2. The English text in the code is the translation key. Wrap user-facing
   strings as they are: no keys file, no extraction step, and no
   hand-written plural or gender branches (Langsys generates those).
3. Read the Langsys project id and API key from environment variables.
   The write key is for development and servers only; anything shipped
   to the browser gets the read-only key.
4. Keep brand names and user-generated content out of translation.

Installieren

composer require langsys/langsys-php

PHP 7.4 oder höher, mit den Erweiterungen curl, json und intl – intl sorgt dafür, dass Pluralformen sowie Zahlen und Datumsangaben für jede Locale korrekt dargestellt werden.

.env
# A server can hold a WRITE key — it never reaches visitors. A write key is
# what lets phrases your pages use for the first time register themselves.
LANGSYS_API_KEY=your-api-key
LANGSYS_PROJECT_ID=your-project-id

Noch kein Projekt und keine Schlüssel? Mit dem Schnellstart haben Sie beides in zwei Minuten.

Der Client

Ein Client pro Anfrage. Er liest seine Zugangsdaten aus der Umgebung und cacht den Katalog jeder Locale, sodass die Übersetzung einer Seite höchstens einen API-Aufruf kostet.

Quelle anzeigen ↗
<?php
require 'vendor/autoload.php';

use LangsysSDKClient;

// Reads LANGSYS_API_KEY and LANGSYS_PROJECT_ID from the environment.
$langsys = new Client();
$langsys->setLocale('es-es');

Translate

translate() erwartet die Sprache als zweites und die Kategorie als drittes Argument. Übergeben Sie null als Sprache, um die aktuelle Sprache des Clients zu verwenden.

Quelle anzeigen ↗
// translate($phrase, $locale, $category, $contentBlockId, $params)
echo $langsys->translate('Order confirmed', null, 'Checkout');   // current locale
echo $langsys->translate('Order confirmed', 'fr-fr', 'Checkout'); // an explicit one

// A phrase the project doesn't have yet renders as written — never blank.

Werte in einem Satz

Platzhalter verwenden {name}, dieselbe Form, die jedes Langsys-SDK speichert, sodass ein Katalog von einem PHP-Backend und einem JS-Frontend identisch gerendert wird.

Quelle anzeigen ↗
// Pass values as params, never build the string yourself.
echo $langsys->translate('Hello, {name}!', null, 'Greetings', null, ['name' => $user->name]);

// sprintf('Hello, %s!', $name) would register "Hello, Sarah!", "Hello, Ahmed!", …
// — one catalog entry per value, billed as words, and impossible to undo.

Pluralformen

Ansehen · 1:14 Pluralisierung

Schreiben Sie den Satz einfach ohne Verzweigung: Langsys erzeugt die Pluralformen jeder Locale bei der Übersetzung, und das SDK rendert die Variante, die zu Ihrer Anzahl passt.

Quelle anzeigen ↗
// Written flat. Langsys generates each locale's plural forms during
// translation and the SDK picks the branch that matches the count.
echo $langsys->translate('You have {count} new messages.', null, 'Inbox', null, ['count' => $count]);

Die von Langsys generierten Pluralformen erreichen PHP ab langsys/langsys-php 1.3.2; frühere Versionen geben für jede Anzahl die Pluralform aus, auch für 1.

Genusübereinstimmung

Spanisch, Französisch oder Russisch flektieren {username} has been invited je nach der Person, um die es geht. Langsys generiert diese Varianten bei der Übersetzung – genauso wie Pluralformen – und das Argument trägt den Namen der Variablen mit angehängtem _gender: male, female oder other. Übergeben Sie es immer, wenn Sie es kennen. So funktioniert es und so finden Sie die Phrasen, die es benötigen →

Das Gender-Argument übergeben Quelle anzeigen ↗
// Pass the agreement argument alongside the value it inflects.
echo $langsys->translate('{username} has been invited', null, 'Team', null, [
    'username'        => $user->name,
    'username_gender' => $user->gender, // 'male' | 'female' | 'other'
]);

Sie kennen das Geschlecht nicht? Übergeben Sie 'other' explizit – das ist der neutrale Zweig. Fehlt der Wert trotzdem, nimmt das SDK automatisch den Zweig other, sodass der Satz weiterhin korrekt klingt.

Kategorien

Die Kategorie grenzt eine Formulierung ein, sodass dieselben Wörter in unterschiedlichen Kontexten unterschiedlich übersetzt werden können.

// Same word, two meanings — the category disambiguates.
echo $langsys->translate('Home', null, 'Main Menu');     // es: "Inicio"
echo $langsys->translate('Home', null, 'Home repairs');  // es: "Casa"

Die Locale des Besuchers

Legen Sie sie über Ihr eigenes Routing oder die Einstellungen des Nutzers fest, oder lassen Sie den Client den Accept-Language-Header des Browsers auslesen.

Quelle anzeigen ↗
use LangsysSDKLocaleLocaleDetector;

// Explicit, from your own routing or the user's settings:
$langsys->setLocale('pt-br');

// Or from the browser: without setLocale(), getLocale() reads Accept-Language
// and falls back to the project's base locale.
$locale = $langsys->getLocale();

// The same detection, from a header your framework hands you:
$locale = LocaleDetector::fromAcceptLanguage($request->getHeaderLine('Accept-Language'));

In Ihren Templates

Ein kleiner Helfer gibt deinen Views einen kurzen Namen und escaped die Ausgabe.

helpers.php
<?php
// helpers.php — one client per request, one short name in your templates.
use LangsysSDKClient;

function t(string $phrase, string $category, array $params = []): string
{
    static $langsys = null;
    $langsys ??= (new Client())->setLocale($_SESSION['locale'] ?? 'en-us');

    return htmlspecialchars($langsys->translate($phrase, null, $category, null, $params));
}

// In a template:
// <h1><?= t('Welcome to our store', 'Home') ?></h1>

Token-Erkennung auf dem Server

Mit einem Schreibschlüssel wird jede Phrase, die das Projekt noch nicht kennt, beim Rendern in eine Warteschlange gestellt und nach der Antwort registriert – der Besucher sieht sofort Ihren Text in der Basissprache, und die Phrase wird für den nächsten Besucher übersetzt. Mit einem schreibgeschützten Schlüssel wird nichts registriert, und nichts geht kaputt.

Quelle anzeigen ↗
// With a write key, translate() queues every phrase the project doesn't have
// and sends them after the response, from a shutdown handler. Nothing to call.
// With a read key the queue is simply dropped — no errors.

// Or register up front, e.g. from a deploy script:
$langsys->registerPhrases([
    ['phrase' => 'Order confirmed', 'category' => 'Checkout'],
    ['phrase' => 'Copyright 2026', 'category' => 'Footer', 'translatable' => false],
]);

Ganze Seiten

Sie haben die Seite bereits als HTML-String? Übersetzen Sie sie in einem Durchgang, inklusive Head.

Quelle anzeigen ↗
// An HTML page you already have as a string: <title>, meta and OpenGraph
// tags, and the body — phrases and content blocks — in one pass.
ob_start();
// … your app renders the page …
$html = ob_get_clean();

echo $langsys->setLocale('es-es')->translatePage($html, 'Home');

Caching

Quelle anzeigen ↗
// Catalogs are cached for an hour (a file cache by default; Redis or none
// via LANGSYS_CACHE_DRIVER). After editing translations in the dashboard:
$langsys->clearCache('es-es');
Dokumentation & Learning Center durchsuchen