Zpět na blog
Terminal window showing a Composer install command for the PolyLingo PHP SDK alongside a short PHP translate call and its JSON output.

Překlad strukturovaného obsahu z PHP pomocí PolyLingo SDK

By Robert M

Překlad strukturovaného obsahu z PHP pomocí PolyLingo SDK

PolyLingo PHP SDK je nyní dostupné na Packagist. Nainstalujte jej pomocí Composeru, předáte mu řetězec prostého textu, Markdown, JSON nebo HTML a získáte zpět překlady do všech jazyků, které potřebujete — bez psaní surových HTTP požadavků nebo obav o poškození struktury během přenosu.

Tento příspěvek pokrývá instalaci, autentizaci a kompletní funkce SDK: synchronní překlad, dávkové požadavky, asynchronní úlohy a zpracování chyb.


Instalace

Vyžaduje PHP 7.4 nebo novější. Instalace přes Composer:

composer require usepolylingo/polylingo

SDK závisí na guzzlehttp/guzzle ^7.8 a psr/http-client ^1.0. Oba balíčky jsou automaticky staženy.


Nastavení klienta

Vytvořte jednu instanci PolyLingo a znovu ji použijte v celé aplikaci. Jedinou povinnou volbou je váš API klíč:

<?php
use PolyLingo\PolyLingo;

$client = new PolyLingo([
    'apiKey' => getenv('POLYLINGO_API_KEY'),
]);

Uložte svůj API klíč do proměnné prostředí. Nikdy jej nezapisujte přímo do kódu ani neukládejte do verzovacího systému.

Dvě volitelné nastavení, která stojí za zmínku:

$client = new PolyLingo([
    'apiKey'  => getenv('POLYLINGO_API_KEY'),
    'baseURL' => 'https://api.usepolylingo.com/v1', // výchozí, přepište pro self-hosted instance
    'timeout' => 120_000,                           // milisekundy, výchozí je 120000 (2 minuty)
]);

Překlad obsahu

Prostý text, Markdown, JSON nebo HTML

Předáte obsah a pole cílových jazykových kódů do translate(). Pole format říká SDK, s jakým typem obsahu pracuje:

$result = $client->translate([
    'content' => '# Hello',
    'targets' => ['es', 'fr', 'de'],
    'format'  => 'markdown',
]);

$es     = $result['translations']['es'];
$tokens = $result['usage']['total_tokens'];

Volba format přijímá hodnoty plain, markdown, json nebo html. Pokud ji vynecháte, API automaticky detekuje formát z obsahu. Můžete také předat jazykový tip source a hodnotu model standard (výchozí) nebo advanced.

Zachování formátu je zde klíčové. U obsahu json jsou překládány pouze textové hodnoty. Klíče, vnoření, pole a netextové typy zůstávají přesně tak, jak jste je poslali. U markdown zůstávají nadpisy nadpisy, bloky kódu jsou ponechány beze změny a URL odkazů se nedotýkáme. U html jsou značky a atributy zachovány a překládají se pouze textové uzly.

Překlad JSON lokalizačního souboru

Běžným případem je překlad lokalizačního souboru. Pošlete celý objekt jako JSON řetězec:

$source = json_decode(file_get_contents('messages/en.json'), true);

$result = $client->translate([
    'content' => json_encode($source),
    'format'  => 'json',
    'targets' => ['de', 'fr', 'ja'],
]);

foreach (['de', 'fr', 'ja'] as $locale) {
    $translated = json_decode($result['translations'][$locale], true);
    file_put_contents(
        "messages/{$locale}.json",
        json_encode($translated, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n"
    );
}

Jeden požadavek zpracuje všechny tři lokalizace. Klíče zůstávají v každém výstupním souboru nezměněné.


Dávkové požadavky

Použijte batch(), když máte více samostatných položek obsahu k překladu. Můžete poslat až 100 položek v jednom požadavku, každou se svým id a volitelným format:

$batch = $client->batch([
    'items' => [
        ['id' => 'hero_title',    'content' => 'Welcome back',              'format' => 'plain'],
        ['id' => 'hero_subtitle', 'content' => 'Here is what is new today', 'format' => 'plain'],
        ['id' => 'cta',           'content' => 'Get started',               'format' => 'plain'],
    ],
    'targets' => ['es', 'fr'],
]);

foreach ($batch['results'] as $row) {
    echo $row['id'] . ': ' . $row['translations']['es'] . "\n";
}

Všechny položky sdílejí stejné pole targets. Odpověď zachovává id, které jste poslali pro každou položku, takže můžete výsledky mapovat zpět na původní data bez závislosti na pořadí.


Asynchronní úlohy

Pro dlouhotrvající překlady (velké dokumenty, mnoho cílů nebo obojí) API úloh přijme požadavek, okamžitě vrátí job_id a umožní vám dotazovat se na výsledek. SDK to řeší dvěma způsoby.

Zařazení do fronty a manuální dotazování

$accepted = $client->jobs->create([
    'content' => file_get_contents('long-article.md'),
    'targets' => ['es', 'fr', 'de', 'ja', 'zh'],
    'format'  => 'markdown',
]);

$jobId = $accepted['job_id'];

// Dotazujte se, dokud úloha nedosáhne konečného stavu
do {
    sleep(5);
    $state = $client->jobs->get($jobId);
} while ($state['status'] === 'pending' || $state['status'] === 'processing');

if ($state['status'] === 'complete') {
    $translations = $state['translations'];
}

Jeden hovor, který dotazuje, dokud není hotovo

Pokud nepotřebujete manuální kontrolu, jobs->translate() za vás zvládne smyčku dotazování:

$done = $client->jobs->translate([
    'content' => file_get_contents('long-article.md'),
    'targets' => ['es', 'fr', 'de'],
    'format'  => 'markdown',

    // Volitelné přepsání (výchozí hodnoty):
    // 'pollInterval' => 5000,       // ms mezi dotazy, výchozí 5000
    // 'timeout'      => 1_200_000,  // celkový čas čekání, výchozí 20 minut
    // 'onProgress'   => function (?int $queuePosition) {
    //     echo "Queue position: {$queuePosition}\n";
    // },
]);

$translations = $done['translations'];
$usage        = $done['usage'];

Callback onProgress se spouští při každém dotazu s aktuální pozicí ve frontě, pokud ji API vrátí, nebo null, pokud není dostupná. Použijte ji pro logování průběhu nebo aktualizaci uživatelského rozhraní.


Pomocné koncové body

Tři lehké koncové body nepotřebují žádné parametry kromě autentizace:

$health = $client->health();
// ['status' => 'ok', 'timestamp' => '...']

$langs = $client->languages();
// ['languages' => [['code' => 'en', 'name' => 'English', 'rtl' => false], ...]]

$usage = $client->usage();
// ['usage' => ['tokens_used' => 12000, 'tokens_remaining' => 88000, ...]]

GET /health a GET /languages nevyžadují API klíč. GET /usage vrací spotřebu tokenů za aktuální kalendářní měsíc pro autentizovaný účet.


Zpracování chyb

Všechny chyby SDK dědí z PolyLingo\Errors\PolyLingoException. Zachyťte konkrétní podtypy, které chcete zpracovat odlišně:

use PolyLingo\Errors\AuthException;
use PolyLingo\Errors\JobFailedException;
use PolyLingo\Errors\PolyLingoException;
use PolyLingo\Errors\RateLimitException;

try {
    $result = $client->translate([
        'content' => '# Hello',
        'targets' => ['es'],
        'format'  => 'markdown',
    ]);
} catch (AuthException $e) {
    // HTTP 401 — neplatný, chybějící nebo odvolaný API klíč
} catch (RateLimitException $e) {
    // HTTP 429 — dosažen limit za minutu
    $retryAfter = $e->getRetryAfter(); // int|null v sekundách
} catch (JobFailedException $e) {
    // Asynchronní úloha dosáhla chybového konečného stavu
    $jobId = $e->getJobId();
} catch (PolyLingoException $e) {
    // Všechny ostatní chyby API
    $httpStatus = $e->getHttpStatus();
    $errorCode  = $e->getErrorCode(); // např. "invalid_request", "translation_error"
}

RateLimitException::getRetryAfter() vrací počet sekund, které je třeba počkat před opakováním, pokud API zahrnuje tento hlavičkový údaj, nebo null, pokud není přítomen. JobFailedException::getJobId() vám dává ID neúspěšné úlohy, abyste ji mohli zaznamenat nebo zobrazit uživateli.


Rychlá reference

MetodaEndpointVyžaduje autentizaci
$client->health()GET /healthNe
$client->languages()GET /languagesNe
$client->translate()POST /translateAno
$client->batch()POST /translate/batchAno
$client->usage()GET /usageAno
$client->jobs->create()POST /jobsAno
$client->jobs->get($id)GET /jobs/:idAno
$client->jobs->translate()POST /jobs + pollingAno

Začněte

SDK je na Packagist na usepolylingo/polylingo. Kompletní dokumentace API je na usepolylingo.com/docs.

Bezplatná úroveň zahrnuje 50 000 tokenů měsíčně. Kreditní karta není potřeba.

composer require usepolylingo/polylingo

Získejte svůj API klíč