PHP langsys/langsys-php

De PHP-basis-SDK: één client voor elke PHP-app — gewone PHP, een framework, een worker of een CLI. De zin in je code is zowel de zoeksleutel als de standaardtekst in de basistaal — geen sleutelbestand, geen extractiestap. De vertaling gebeurt op de server, dus de pagina komt al gelokaliseerd binnen.

Dit is een backend-SDK, dus er is geen playground in de browser op deze pagina — de browser kan geen PHP uitvoeren. Werk je met Laravel? Het Laravel-pakket verpakt deze client met een Blade-directive, middleware en een facade. Volledige referentie: de README.

Gebruik je een AI-codeeragent? Geef hem deze 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.

Installeren

composer require langsys/langsys-php

PHP 7.4 of hoger, met de extensies curl, json en intl — intl zorgt voor het weergeven van meervoudsvormen en het opmaken van getallen en datums per locale.

.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

Nog geen project of sleutels? Met de Snelstart heb je beide in twee minuten.

De client

Eén client per verzoek. Die haalt zijn inloggegevens uit de omgeving en cachet de catalogus van elke locale, zodat het vertalen van een pagina hooguit één API-aanroep kost.

Bron bekijken ↗
<?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');

Vertalen

translate() neemt de taalregio als tweede en de categorie als derde argument. Geef null mee als taalregio om de huidige taalregio van de client te gebruiken.

Bron bekijken ↗
// 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.

Waarden in een zin

Placeholders gebruiken {name}, dezelfde notatie die elke Langsys SDK opslaat, zodat één catalogus identiek wordt weergegeven vanuit een PHP-backend en een JS-frontend.

Bron bekijken ↗
// 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.

Meervoudsvormen

Bekijken · 1:14 Meervoudsvormen

Schrijf de zin gewoon plat op: Langsys genereert tijdens het vertalen de meervoudsvormen van elke locale, en de SDK rendert de variant die bij jouw aantal past.

Bron bekijken ↗
// 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]);

De meervoudsvormen die Langsys genereert, bereiken PHP vanaf langsys/langsys-php 1.3.2; eerdere versies geven voor elk aantal de meervoudsvorm weer, ook bij 1.

Geslachtsovereenkomst

Spaans, Frans of Russisch verbuigen {username} has been invited naar de persoon over wie het gaat. Langsys genereert die varianten tijdens het vertalen — op dezelfde manier als meervoudsvormen — en het argument is vernoemd naar de variabele, met _gender erachter: male, female of other. Geef het mee wanneer je het weet. Hoe het werkt en hoe je de zinnen vindt die het nodig hebben →

Het geslachtsargument meegeven Bron bekijken ↗
// 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'
]);

Weet je het geslacht niet? Geef 'other' expliciet mee — dat is de neutrale tak. Ontbreekt het toch, dan neemt de SDK voor jou de other-tak, zodat de zin nog steeds goed leest.

Categorieën

De categorie bepaalt de reikwijdte van een zin, zodat dezelfde woorden in verschillende contexten anders vertaald kunnen worden.

// 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"

De locale van de bezoeker

Stel het in via je eigen routing of de instellingen van de gebruiker, of laat de client de Accept-Language-header van de browser uitlezen.

Bron bekijken ↗
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 je sjablonen

Een kleine helper geeft je views een korte naam en escapet de uitvoer.

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-detectie op de server

Met een schrijfsleutel wordt elke zin die het project nog niet kent in de wachtrij gezet terwijl je hem rendert en na het antwoord geregistreerd — de bezoeker ziet meteen je tekst in de basistaal, en de zin wordt vertaald voor de volgende bezoeker. Met een alleen-lezen sleutel wordt niets geregistreerd en gaat er niets stuk.

Bron bekijken ↗
// 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],
]);

Hele pagina's

Heb je de pagina al als HTML-string? Vertaal hem in één keer, inclusief de head.

Bron bekijken ↗
// 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

Bron bekijken ↗
// 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');
Doorzoek de documentatie en het Learning Center