PHP langsys/langsys-php
O SDK PHP base: um único cliente para qualquer aplicação PHP — PHP puro, um framework, um worker ou uma CLI. A frase no seu código é, ao mesmo tempo, a chave de consulta e o padrão no idioma base — sem arquivo de chaves, sem etapa de extração. A tradução acontece no servidor, então a página já chega localizada.
SDK de backend, então não há playground no navegador nesta página — o navegador não consegue executar PHP. Usa Laravel? O pacote do Laravel envolve este cliente com uma diretiva Blade, um middleware e uma facade. Referência completa: o README.
Está usando um agente de programação com IA? Dê a ele 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 ou superior, com as extensões curl, json e intl — a intl é quem renderiza os plurais e formata números e datas para cada localidade.
# 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 Ainda não tem projeto ou chaves? O Início rápido entrega os dois em dois minutos.
O cliente
Um cliente por requisição. Ele lê as credenciais do ambiente e armazena em cache o catálogo de cada localidade, então traduzir uma página custa no máximo uma chamada à 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'); Translate
translate() recebe o idioma como segundo argumento e a categoria como terceiro. Passe null no idioma para usar o idioma atual do 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 em uma frase
Os placeholders usam {name}, a mesma forma que todo SDK da Langsys armazena, de modo que um único catálogo é renderizado de forma idêntica em um backend PHP e em um 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. Plurais
Escreva a frase de forma simples: o Langsys gera as formas plurais de cada localidade durante a tradução, e o SDK renderiza a variante que corresponde à sua contagem.
// 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]); As formas plurais que o Langsys gera chegam ao PHP a partir do langsys/langsys-php 1.3.2; versões anteriores renderizam a forma plural para qualquer quantidade, inclusive 1.
Concordância de gênero
Espanhol, francês ou russo flexionam {username} has been invited de acordo com a pessoa a quem se refere. O Langsys gera essas variantes durante a tradução — do mesmo jeito que gera os plurais — e o argumento recebe o nome da variável, com _gender no final: male, female ou other. Informe-o sempre que souber. Como funciona e como encontrar as frases que precisam dele →
// 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'
]); Não sabe o gênero? Passe 'other' explicitamente — é o ramo neutro. Se ele estiver ausente, o SDK usa o ramo other para você, e a frase continua sendo exibida corretamente.
Categorias
A categoria delimita o escopo de uma frase, então as mesmas palavras podem ser traduzidas de forma diferente em contextos diferentes.
// 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" O idioma do visitante
Defina-o a partir do seu próprio roteamento ou das configurações do usuário, ou deixe o cliente ler o cabeçalho Accept-Language do 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')); Nos seus templates
Um pequeno helper dá às suas views um nome curto e faz o escape da saída.
<?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> Descoberta de tokens no servidor
Com uma chave de escrita, toda frase que o projeto ainda não viu é colocada na fila enquanto você a renderiza e registrada após a resposta — o visitante vê imediatamente o texto no idioma base, e a frase é traduzida para o próximo. Com uma chave somente leitura, nada é registrado e nada quebra.
// 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 inteiras
Já tem a página como uma string HTML? Traduza tudo de uma vez, inclusive o 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'); 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');