crowdin/crowdin-api-client
Official PHP client for Crowdin's REST API, letting Laravel and PHP applications manage localization projects, source strings, translations, glossaries, and builds programmatically. Wraps every endpoint in a clean, object-oriented SDK with typed requests and responses for Crowdin Cloud and Enterpris...
Architecture fit
Crowdin client resolves resource APIs by naming convention through __get() (styleGuide → StyleGuideApi), with class-level @property docblocks standing in for a real interface. Treat it as a dynamically-dispatched client: IDE support comes only from docblocks, and Larastan/PHPStan will see mixed unless you annotate or wrap.Integration feasibility
composer require crowdin/crowdin-api-client plus a singleton binding using an API token and project ID is an afternoon. The SDK absorbs auth headers, pagination helpers (_list, _get, _create, _update, _delete), and model hydration — roughly 70% of what a hand-rolled Guzzle client would cost you to build and maintain.Technical risk
update() computes a JSON-Patch by diffing current property values against the original payload, keyed on property names matching API JSON keys exactly. A mismatched name sends nothing and raises nothing. This is safe if you never touch models, and a trap if you subclass or map into them.Api/Enterprise/<Name>Api class exists, it silently replaces the base class for Enterprise clients. Same method names, potentially different payload shapes. Anyone testing against the community API and shipping to Enterprise can pass CI and fail in production.Crowdin.php registration, two test files, dual @link docblocks, phpDocumentor build). New Crowdin API surface will arrive in the SDK later than in the REST docs. The escape hatch — issuing a raw request outside AbstractApi — is not documented, so confirm it exists before assuming you can patch around gaps.Key questions
_list expose cursor/offset pagination and total counts, and are large file uploads streamed or buffered in memory?Stack fit
TranslationProvider) implemented by a CrowdinTranslationProvider, and map SDK Model\* objects to your own DTOs at that seam. This isolates you from the __get() dispatcher, from Enterprise subclass shadowing, and from a future vendor swap.Crowdin::class unless multiple teams consume it; a single injected adapter is easier to test and to reason about.Migration path
Compatibility
Sequencing
CrowdinApiClient type appears outside the infrastructure layer.Maintenance
Support
composer update stays viable.Scaling
Illuminate\Queue\Middleware\RateLimited) rather than calling the API inside a web request.Failure modes
401/403 from token expiry or scope drift → surface as a distinct alert, not a generic API error; it usually means someone rotated credentials without redeploying.429 rate limiting → retry with jittered backoff; without middleware you will silently drop syncs.update() → mitigated by never mutating SDK models in application code; add an integration test that changes a field and asserts the remote value changed._list pagination plus per-item errors means a job can half-succeed. Make each unit of work idempotent and record Crowdin IDs locally.Ramp-up
list/get/create/update/delete convention is self-evident. The AGENTS.md contributor guide is not consumer documentation — it describes how to extend the SDK, and reading it as onboarding material will mislead.How can I help you explore Laravel packages today?