joedixon/laravel-translation
A Laravel package for managing app translations through a built-in web UI. Browse and edit language strings, add new locales, and keep translations organized using file or database drivers.
Architecture fit. joedixon/laravel-translation is a conventional Laravel package: a service provider, publishable config, package routes, and Blade views that give you an in-app UI for browsing and editing lang/ files. It is an authoring-time tool, not a runtime dependency — end users only touch it if you expose the routes. That makes it a clean architectural fit for a Laravel monolith or modular app that ships file-based translations and wants developers, PMs, or in-house translators to fix copy without a code change. It does not replace a translation management system (Crowdin, Lokalise, Phrase); it is the "small team, few locales, strings live in git" tier of tooling.
Integration feasibility. Low technical effort on the happy path: composer require, publish config/views, wrap the package routes in an authorization gate, and point editors at it. The friction is environmental rather than code-level.
lang/ directory — fine on a VM, problematic on read-only or ephemeral container filesystems (Vapor, Cloud Run, hardened Kubernetes).lang/en.json) versus PHP array files separately — historically the weaker path.Technical risk. The dominant risk is lifecycle, not code. Last release was 2023-04-26, which predates Laravel 11 and 12; expect Composer constraint conflicts on current Laravel and no upstream fix for them. The package is small enough to fork and patch (roughly a service provider, routes, controllers, views), but that is a permanent, if modest, tax. Secondary risks: an authenticated route that writes executable PHP into the codebase is a high-value target if the gate is misconfigured; concurrent saves have no locking or audit trail beyond git; and a write interrupted mid-save can leave a malformed PHP file that fatals the next request.
Key questions.
Stack fit. Strongest on Laravel 8–10 with PHP 8.0–8.2 and a conventional resources/lang (or lang/) tree using __() / @lang. Weakest where deployments are immutable or where an external TMS already owns the translation lifecycle. Treat it as a developer-and-PM convenience layer over git, not as a source of truth.
Migration path.
local-only middleware, and confirm the routes are excluded from public route caching exposure.lang/ structure, so no content migration is needed — but inventory which locales and namespaces are in scope, and confirm JSON files are covered.Compatibility. Validate PHP 8.3+, the illuminate/* constraint range, asset pipeline (Vite vs. Mix expectations in the published views), and whether config:cache / route:cache interact badly with package routes. If constraints are stale, the least-bad options in order are: pin to the last supported Laravel line, use a maintained community fork, or vendor a patched copy with a replace entry.
Sequencing. (1) Version/compatibility spike → (2) fork-or-not decision → (3) auth gate and route lockdown → (4) single-namespace pilot with one editor → (5) written runbook and handover. Do not sequence the UI rollout before the auth gate; that is the one ordering that creates a real incident.
Maintenance. Budget for a low-but-permanent maintenance line: one backend engineer owning a fork, bumping constraints on each Laravel major, and running a smoke test that mounts the routes and writes a fixture file. Pin the version explicitly and do not float it.
Support. Community-only — GitHub issues, no SLA, no vendor. If it breaks during an upgrade, we fix it or drop it. That is acceptable for an internal authoring tool and unacceptable if any business process becomes dependent on it without a documented fallback (editing the files directly in git always remains the fallback; say so in the runbook).
Scaling. Comfortable at a few locales and a few hundred to low thousands of keys. Degrades on two axes: concurrent editors (last-write-wins on a whole file, no merge) and file size (large PHP arrays mean noisy git diffs and a sluggish UI). Past ~3 concurrent editors or a formal translation vendor workflow, migrate to a TMS and keep this only as a developer convenience.
Failure modes to pre-empt.
www-data vs. root-owned files) → save failures.Ramp-up. A Laravel developer is productive in under an hour. A non-technical editor needs a one-page guide covering how keys map to files, the difference between group/key strings and JSON strings, why changes require a deploy, and who to contact when a string looks wrong. The deploy dependency — not the interface — is what determines whether this tool gets adopted or abandoned.
How can I help you explore Laravel packages today?