arthur-salenko / translator-client
PHP SDK client for Translator microservice
Package info
github.com/arthur-salenko/translator-client
pkg:composer/arthur-salenko/translator-client
v1.2.2
2026-01-23 13:54 UTC
Requires
- php: ^8.1
- guzzlehttp/guzzle: ^7.8
Requires (Dev)
- phpunit/phpunit: ^10.5
README
PHP SDK for the translator service.
Requirements
- PHP
^8.1
Installation
composer require arthur-salenko/translator-client
Usage
use ArthurSalenko\TranslatorClient\ClientConfig; use ArthurSalenko\TranslatorClient\Dto\TranslationItem; use ArthurSalenko\TranslatorClient\TranslatorClient; $client = new TranslatorClient(new ClientConfig( baseUrl: 'https://translator.my-domain.tld', brandKey: 'YOUR_BRAND_KEY', )); // Health $health = $client->health()->get(); // Languages $languages = $client->languages()->index(); // Brands $brands = $client->brands()->index(); // Folders $folders = $client->folders()->index(); // Upsert translations $result = $client->admin()->translations()->upsert(items: [ new TranslationItem('common', 'sitename', ['en' => 'Hello', 'ru' => 'Привет']), ]); // Create brand (admin) // Note: requires brandKey in ClientConfig, otherwise API responds with 401 $newBrand = $client->admin()->brands()->create(code: 'doncoupon_ua', name: 'Doncoupon UA');
Configuration
use ArthurSalenko\TranslatorClient\ClientConfig; use ArthurSalenko\TranslatorClient\TranslatorClient; $config = new ClientConfig( baseUrl: 'https://translator.my-domain.tld', brandKey: 'YOUR_BRAND_KEY', timeoutSeconds: 10.0, connectTimeoutSeconds: 5.0, userAgent: 'my-app/1.0', ); $client = new TranslatorClient($config);
Custom Guzzle client
use ArthurSalenko\TranslatorClient\ClientConfig; use ArthurSalenko\TranslatorClient\TranslatorClient; use GuzzleHttp\Client as GuzzleClient; $guzzle = new GuzzleClient([ 'verify' => false, ]); $client = new TranslatorClient( new ClientConfig('https://translator.my-domain.tld', 'YOUR_BRAND_KEY'), $guzzle, );
Translations API
Unless specified explicitly, read methods that accept lang default to en.
Revisions
$revs = $client->translations()->revision();
Get translations (JSON + headers)
indexResponse() returns a response object with:
statusCodeheadersjsonrawBody
$response = $client->translations()->indexResponse(lang: 'ru'); if ($response->statusCode === 200) { $revision = $response->json['revision'] ?? null; $data = $response->json['data'] ?? []; }
Translations (ETag)
Service endpoint index may return 304 Not Modified.
The SDK provides methods that return status + headers:
$response = $client->translations()->indexResponse( lang: 'ru', folder: 'common', format: 'tree', scope: 'merged', ifNoneMatch: $etag, ); if ($response->statusCode === 304) { // use cached response } else { $etag = $response->header('ETag'); $revision = $response->json['revision'] ?? null; $data = $response->json['data'] ?? []; }
Get translation value
$value = $client->translations()->show(folder: 'common', key: 'sitename'); // service response: { revision: string, value: mixed|null }
Upsert translations
use ArthurSalenko\TranslatorClient\Dto\TranslationItem; $res = $client->admin()->translations()->upsert( items: [ new TranslationItem('common', 'sitename', ['en' => 'Hello', 'ru' => 'Привет']), ], target: 'brand', ); $brandCode = $res->brandCode; $baseRevision = $res->baseRevision; $brandRevision = $res->brandRevision; $effectiveRevision = $res->effectiveRevision; $insertedToBase = $res->insertedToBase;
Errors
ArthurSalenko\TranslatorClient\Exception\ApiException— HTTP4xx/5xx(including parsed JSON, if available)ArthurSalenko\TranslatorClient\Exception\NetworkException— network/transport errors
use ArthurSalenko\TranslatorClient\Exception\ApiException; use ArthurSalenko\TranslatorClient\Exception\NetworkException; try { $client->admin()->translations()->upsert(items: [ new TranslationItem('common', 'sitename', ['en' => 'Hello', 'ru' => 'Привет']), ]); } catch (ApiException $e) { $status = $e->statusCode; $raw = $e->responseBody; $json = $e->responseJson; } catch (NetworkException $e) { // connection errors, timeouts, etc }