PHP langsys/langsys-php
Базовий PHP SDK: один клієнт для будь-якого PHP-застосунку — чистого PHP, фреймворка, воркера чи CLI. Фраза у вашому коді водночас є ключем пошуку та стандартним текстом базової мови — без файлу ключів і без кроку витягування. Переклад відбувається на сервері, тож сторінка надходить уже локалізованою.
Це бекенд-SDK, тому на цій сторінці немає playground у браузері — браузер не може виконувати PHP. Працюєте з Laravel? Пакет для Laravel обгортає цей клієнт директивою Blade, middleware і фасадом. Повна довідка: README.
Користуєтеся ШІ-агентом для кодування? Дайте йому цей промпт
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. Встановити
composer require langsys/langsys-php PHP 7.4 або новіший із розширеннями curl, json та intl — саме intl відповідає за множини та форматування чисел і дат для кожної локалі.
# 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 Ще немає проєкту чи ключів? Швидкий старт дасть вам і те, і інше за дві хвилини.
Клієнт
Один клієнт на запит. Він зчитує облікові дані із середовища та кешує каталог кожної локалі, тож переклад сторінки коштує щонайбільше одного виклику 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() приймає локаль другим аргументом, а категорію — третім. Передайте null замість локалі, щоб використати поточну локаль клієнта.
// 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. Значення в реченні
Заповнювачі використовують {name} — ту саму форму, яку зберігає кожен SDK Langsys, тож один каталог однаково відображається і з PHP-бекенду, і з 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. Множина
Пишіть речення без розгалужень: Langsys генерує форми множини для кожної локалі під час перекладу, а SDK відтворює варіант, що відповідає вашій кількості.
// 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]); Множинні форми, які генерує Langsys, потрапляють до PHP із langsys/langsys-php версії 1.3.2; у попередніх версіях форма множини використовується для будь-якої кількості, зокрема й для 1.
Узгодження за родом
В іспанській, французькій чи російській мовах {username} has been invited змінюється залежно від особи, про яку йдеться. Langsys генерує ці гілки під час перекладу — так само, як і множинні форми — а аргумент називається за змінною з доданим _gender: male, female або other. Передавайте його щоразу, коли знаєте значення. Як це працює і як знайти фрази, яким це потрібно →
// 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'
]); Не знаєте стать? Передайте 'other' явно — це нейтральна гілка. Якщо її все одно немає, SDK бере для вас гілку other, тож речення все одно читається правильно.
Категорії
Категорія задає область дії фрази, тож однакові слова можуть перекладатися по-різному в різних контекстах.
// 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" Локаль відвідувача
Задайте її зі свого роутингу чи налаштувань користувача або дозвольте клієнту прочитати заголовок Accept-Language браузера.
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')); У ваших шаблонах
Невеликий допоміжний засіб дає вашим поданням коротку назву та екранує вивід.
<?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> Виявлення токенів на сервері
З ключем для запису кожна фраза, якої проєкт іще не бачив, ставиться в чергу під час відображення й реєструється після відповіді — відвідувач одразу бачить текст базовою мовою, а фраза перекладається для наступного. З ключем лише для читання нічого не реєструється, і нічого не ламається.
// 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],
]); Цілі сторінки
Уже маєте сторінку у вигляді HTML-рядка? Перекладіть її за один прохід, разом із 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'); Кешування
// 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');