rivalex/lingua
Lingua is a self-hosted translation manager for Laravel 11–13 that stores i18n strings in your database or lang files. It adds a Livewire admin UI plus CSV, JSON, XLSX, and ODS import/export with dry-run previews, RTL support, and 26 bundled locales.
Architecture fit. Lingua targets the exact stack a modern Laravel product team is likely running: Laravel 11–13, Livewire 4.1+, Flux UI, PHP 8.3+. For a TALL-stack monolith it slots in as a first-party admin module rather than an external SaaS — no SSO bridging, no outbound webhooks for basic editing, no per-seat licensing. The dual storage driver (database or lang/ files) is the architecturally interesting decision: database mode makes translations runtime-editable and cacheable, file mode preserves the deployment-time artifact model that many teams and CI pipelines already depend on. The bi-directional sync between the two is what makes this viable as a replacement rather than a parallel system.
Integration feasibility. Installation is a single Composer require plus an interactive lingua:install that is driver-aware (file mode skips the language_lines migration). Routes, middleware, gate, prefix, and layout are all config-driven, and routes_extra_parameters supports multi-tenant URI fragments — a signal the author has thought about non-trivial deployments. Import/export covers CSV, JSON, XLSX, ODS with a mandatory dry-run, which de-risks the one operation (bulk write to translation files) that can silently corrupt a production app. The bundled 26-locale / 5,902-string dataset removes the laravel-lang/common dependency, which is itself a meaningful integration simplification.
Technical risk. This is the dominant concern and it is not about code quality — 780+ Pest tests, Codecov, and CI badges suggest a disciplined author. The risk is adoption and bus factor: 0 stars, 0 dependents, and a score of ~25 place this firmly in unproven territory. There is no evidence of a second maintainer, no published security policy, no visible enterprise reference. Additional concrete risks:
lang/ path is a mounted volume or the workflow pushes changes back to git.Key questions to put to the maintainer / your own team.
lingua:uninstall reliably restore a clean lang/ tree, and has that been exercised in CI?Stack fit. Strong on paper. If the host application is a Laravel monolith on the TALL stack with Livewire already in use, Lingua is the lowest-friction category of tool: same auth, same layout, same component model, same deployment unit. It is a poor fit for API-only services, multi-language frontends served from a separate CMS, or teams standardized on Lokalise/Crowdin with existing translator workflows — replacing those is an organizational change, not a technical one.
Migration path. The credible sequence is:
lang/ files, vendor-published translations, and any spatie/laravel-translation-loader usage. Establish a baseline string count per locale/group.__() call sites before promoting.Compatibility. Constraints are tight and explicit: PHP 8.3+, Laravel 11–13, Livewire 4.1+, Flux 2.12+, optional openspout/openspout for XLSX/ODS. The Livewire 4 and Laravel 13 floors mean this package is aimed at teams already near the leading edge; a team on Laravel 10 or Livewire 3 is not a candidate without a framework upgrade. Database support is broad (SQLite, MySQL, PostgreSQL, SQL Server), which removes the usual driver caveat.
Sequencing. Treat this as three gated phases with explicit exit criteria:
lingua:uninstall verified clean.Maintenance. MIT license with a recent release cadence and a changelog is fine, but the maintenance model is effectively you. With zero dependents, there is no ecosystem pressure testing upgrades — you will be the first to hit Laravel or Livewire breaking changes. Budget a standing allocation for version bumps, and decide up front whether you are willing to fork. If the answer is no, this package should not touch production translation workflows.
Support. Documentation lives on a separate GitHub Pages site, which is a good sign of investment. But support is best-effort. The Pro tier implies a commercial support path may emerge — treat that as a roadmap item to confirm, not an assumption. Escalation for a broken import at 2am is currently "read the source."
Scaling. Two dimensions to size:
Failure modes to plan for. (a) Stale cache after an edit — symptom is "I changed it and the app still shows the old string"; mitigation is a verified invalidation path plus a cache-clear command in the runbook. (b) Lost file writes on ephemeral containers. (c) Import applied without dry-run review, overwriting human-reviewed strings — mitigated by permissions and a pre-import git commit or DB snapshot. (d) Migration rollback leaving orphaned language_lines tables. (e) Vendor translation drift when a dependency publishes new keys. (f) AI translation (Pro) sending strings to a third party.
Ramp-up. Low for engineers — the interactive installer, config file, and facade are conventional Laravel idioms, and the README is unusually complete. Low-to-moderate for non-technical translators — the UI is the product, but the workflow (import scopes, bilingual vs. multi-locale, dry-run review, sync direction) needs a short internal guide. Expect roughly a day of engineering onboarding and an hour of translator training with a written runbook.
TPM recommendation. The right framing is conditional pilot, not adoption. The technical surface is well-matched and unusually well-tested for a zero-star package, but adoption risk is real and unmitigated by community. Run the Phase 1 evaluation on a non-critical application in file mode with a hard time-box. Promote only if the cache-invalidation behavior, the uninstall/rollback path, and the import round-trip all verify cleanly, and only with an export-based backup running independently of the package itself. Pair this evaluation with a one-page fork contingency plan so the decision isn't revisited under pressure.
How can I help you explore Laravel packages today?