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