PHP langsys/langsys-php
Le SDK PHP de base : un seul client pour toute application PHP — PHP natif, framework, worker ou CLI. La phrase dans votre code sert à la fois de clé de recherche et de valeur par défaut dans la langue de base — pas de fichier de clés, pas d'étape d'extraction. La traduction se fait côté serveur : la page arrive donc déjà localisée.
SDK backend : il n’y a donc pas de playground dans le navigateur sur cette page, car le navigateur ne peut pas exécuter PHP. Vous utilisez Laravel ? Le package Laravel encapsule ce client avec une directive Blade, un middleware et une facade. Référence complète : le README.
Vous utilisez un agent de codage IA ? Donnez-lui ce 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. Installer
composer require langsys/langsys-php PHP 7.4 ou version ultérieure, avec les extensions curl, json et intl — intl se charge de gérer les pluriels et de mettre en forme les nombres et les dates pour chaque locale.
# 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 Pas encore de projet ni de clés ? Le démarrage rapide vous fournit les deux en deux minutes.
Le client
Un client par requête. Il lit ses identifiants depuis l'environnement et met en cache le catalogue de chaque locale : traduire une page coûte donc au plus un appel d'API.
<?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'); Traduire
translate() prend la locale en deuxième argument et la catégorie en troisième. Passez null pour la locale afin d’utiliser celle du client en cours.
// 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. Valeurs dans une phrase
Les variables utilisent {name}, le format que stocke chaque SDK Langsys, si bien qu'un même catalogue s'affiche de façon identique depuis un backend PHP et un frontend JS.
// 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. Pluriels
Écrivez la phrase à plat : Langsys génère les formes plurielles de chaque locale pendant la traduction, et le SDK affiche la variante correspondant à votre nombre.
// 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]); Les formes plurielles générées par Langsys arrivent dans PHP à partir de langsys/langsys-php 1.3.2 ; les versions antérieures affichent la forme du pluriel pour tous les nombres, y compris 1.
Accord en genre
L'espagnol, le français ou le russe accordent {username} has been invited selon la personne concernée. Langsys génère ces variantes pendant la traduction — comme il génère les pluriels — et l'argument porte le nom de la variable, suivi de _gender : male, female ou other. Transmettez-le dès que vous le connaissez. Comment cela fonctionne, et comment repérer les phrases concernées →
// 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'
]); Vous ne connaissez pas le genre ? Passez 'other' explicitement : c’est la branche neutre. S’il manque malgré tout, le SDK emprunte pour vous la branche other, et la phrase reste donc correcte.
Catégories
La catégorie délimite le périmètre d'une phrase : les mêmes mots peuvent ainsi être traduits différemment selon le contexte.
// 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" La locale du visiteur
Définissez-la à partir de votre propre routage ou des paramètres de l'utilisateur, ou laissez le client lire l'en-tête Accept-Language du navigateur.
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')); Dans vos templates
Un petit utilitaire donne à vos vues un nom court et échappe la sortie.
<?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> Découverte des jetons côté serveur
Avec une clé en écriture, chaque phrase que le projet n’a pas encore vue est mise en file d’attente lors de son rendu, puis enregistrée après la réponse — le visiteur voit immédiatement votre texte dans la langue de base, et la phrase est traduite pour le suivant. Avec une clé en lecture seule, rien n’est enregistré et rien ne se casse.
// 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],
]); Pages entières
Vous avez déjà la page sous forme de chaîne HTML ? Traduisez-la en une seule passe, y compris le 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'); Mise en cache
// 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');