What is Over-the-Air (OTA) Translations?
Over-the-air translations are translation updates delivered to a running application without shipping a new build. The app fetches its strings from a translation service at runtime, usually through a cached API, so publishing a corrected translation updates the product in production with no deploy, no release train, and no waiting.
The term comes from mobile, where it solves the app-store review delay, but the same model pays off on the web: a typo fix or a legal-text update becomes a content operation instead of a code change funneled through a developer, a pull request, and a pipeline. Non-developers can own copy end to end.
The engineering concerns are caching and resilience: strings must be cached so the translation service is not in the hot path of every request, and the app needs a sane fallback, bundled or last-known-good strings, if the service is unreachable. Invalidation is the third piece: a cache that only expires on a timer means a fix can take as long as the TTL to appear, so OTA systems usually push a notification, typically a signed webhook, telling the app to drop the affected strings immediately, and keep the TTL as a safety net.
In Laravel, OTA translation means replacing or wrapping the translation loader so __() reads from a cache filled from the translation service instead of only from lang/ on disk. Your views do not change. LangSyncer's live mode works this way: it loads each translation group from a CDN into your cache, clears the cached groups when a signed webhook announces a publish, and falls back to the lang files on disk if the CDN cannot be reached. Static mode is the alternative when you prefer translations pinned at deploy time: the same webhook triggers a sync that rewrites the lang files instead.
# .env: serve translations over the air
CLI_TRANSLATOR_CLIENT_MODE=live
CLI_TRANSLATOR_CLIENT_CACHE_TTL=3600 # safety net if a webhook is missed
{{-- Views stay exactly the same --}}
<h1>{{ __('dashboard.title') }}</h1>