PHP langsys/langsys-php

El SDK base de PHP: un solo cliente para cualquier aplicación PHP, ya sea PHP puro, un framework, un worker o una CLI. La frase en tu código es a la vez la clave de búsqueda y el valor predeterminado en el idioma base: sin archivo de claves ni paso de extracción. La traducción se realiza en el servidor, así que la página llega ya localizada.

Es un SDK de backend, así que en esta página no hay un playground en el navegador: el navegador no puede ejecutar PHP. ¿Usas Laravel? El paquete de Laravel envuelve este cliente con una directiva de Blade, un middleware y una facade. Referencia completa: el README.

¿Usas un agente de programación con IA? Dale este 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.

Instalar

composer require langsys/langsys-php

PHP 7.4 o posterior, con las extensiones curl, json e intl: intl es la que muestra los plurales y da formato a los números y las fechas para cada configuración regional.

.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

¿Aún no tienes proyecto ni claves? El Inicio rápido te da ambos en dos minutos.

El cliente

Un cliente por solicitud. Lee sus credenciales del entorno y almacena en caché el catálogo de cada configuración regional, así que traducir una página cuesta una llamada a la API como máximo.

Ver código fuente ↗
<?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() recibe el idioma como segundo argumento y la categoría como tercero. Pasa null en el idioma para usar el actual del cliente.

Ver código fuente ↗
// 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.

Valores en una oración

Los marcadores de posición usan {name}, el mismo formato que almacenan todos los SDK de Langsys, de modo que un mismo catálogo se renderiza de forma idéntica desde un backend PHP y un frontend JS.

Ver código fuente ↗
// 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.

Plurales

Ver · 1:14 Pluralización

Escribe la oración en forma simple: Langsys genera las formas plurales de cada configuración regional durante la traducción, y el SDK muestra la variante que corresponde a tu cantidad.

Ver código fuente ↗
// 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]);

Las formas plurales que genera Langsys llegan a PHP desde langsys/langsys-php 1.3.2; las versiones anteriores muestran la forma plural para cualquier cantidad, incluido el 1.

Concordancia de género

El español, el francés o el ruso flexionan {username} has been invited según la persona a la que se refiere. Langsys genera esas ramas durante la traducción, igual que genera los plurales, y el argumento lleva el nombre de la variable con _gender al final: male, female u other. Pásalo siempre que lo sepas. Cómo funciona y cómo encontrar las frases que lo necesitan →

Cómo pasar el argumento de género Ver código fuente ↗
// 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'
]);

¿No sabes el género? Pasa 'other' de forma explícita: es la rama neutra. Si de todos modos falta, el SDK toma la rama other por ti, así que la oración se lee correctamente.

Categorías

La categoría delimita el alcance de una frase, por lo que las mismas palabras pueden traducirse de forma distinta según el contexto.

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

El idioma del visitante

Establécela desde tu propio enrutamiento o desde la configuración del usuario, o deja que el cliente lea el encabezado Accept-Language del navegador.

Ver código fuente ↗
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'));

En tus plantillas

Una pequeña función auxiliar da a tus vistas un nombre corto y escapa la salida.

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>

Descubrimiento de tokens en el servidor

Con una clave de escritura, cada frase que el proyecto no haya visto se pone en cola al renderizarla y se registra después de la respuesta: el visitante ve de inmediato el texto en tu idioma base, y la frase se traduce para el siguiente. Con una clave de solo lectura no se registra nada y nada se rompe.

Ver código fuente ↗
// 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],
]);

Páginas completas

¿Ya tienes la página como una cadena HTML? Tradúcela de una sola vez, incluido el head.

Ver código fuente ↗
// 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');

Almacenamiento en caché

Ver código fuente ↗
// 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');
Buscar en la documentación y el Centro de aprendizaje