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.
# 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.
<?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.
// 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.
// 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
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.
// 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 →
// 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.
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.
<?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.
// 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.
// 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
// 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');