lordjancso/translation-bundle
Symfony bundle that centralizes translation management, letting you edit, organize, and maintain multilingual strings through a database-backed workflow instead of hand-editing language files. Integrates into existing projects to keep translations in sync.
Architecture fit — the stack premise is wrong and that is the first thing to flag. Despite the brief calling this a "Laravel/PHP package," lordjancso/translation-bundle is a Symfony bundle. It depends on symfony/framework-bundle, Symfony's TranslatorInterface, Symfony DI service decoration, kernel bundle registration, and Doctrine ORM entity mapping. Laravel has no bundle discovery, no kernel registry, and no equivalent of the bundle's DI extension contract. Fit against a Laravel codebase is zero without a rewrite or a port — this is not an adapter problem, it is a different framework. The only genuine fits are (a) an existing Symfony service in the fleet, or (b) a standalone Symfony sidecar used purely as a translation-authoring tool against a shared database.
Integration feasibility — low, and the estimate belongs to a platform task, not a dependency bump. Installing the vendor code via Composer is trivial; everything after that is Symfony platform work: register the bundle, author config, run Doctrine migrations for the message/locale entities, import existing catalogs, import or expose routes, put those routes behind an authenticated firewall with a role check, ensure cache/resource directories are writable, and wire an explicit translation-cache-clear into the publish workflow. In a Laravel organisation none of this is reusable knowledge, which is the real cost driver.
Technical risk — high, and concentrated in project health rather than code volume.
Key questions a TPM should get answered before spending engineering time:
translation:extract / lint:translations rather than replacing them?Verdict for planning purposes: not an adoption candidate for a Laravel stack. For a Symfony service, a time-boxed spike with a pre-agreed stop condition, explicitly treated as "evaluating code we may have to own," not "evaluating a supported product."
Stack fit is the gating decision, and it should be resolved before any feature discussion. Three paths, each with a different owner and cost:
TranslationServiceProvider binding over Laravel's file loader, an admin CRUD screen behind existing auth) is on the order of a day or two and inherits our auth, our deploy pipeline, and our on-call. This is the recommended path for a Laravel-only organisation and should be presented to stakeholders as the realistic "build" option, not as a failure of the evaluation.Migration path (whichever path is chosen). The pattern matters more than the tool: (1) sandbox environment; (2) install and enable the bundle manually rather than relying on Flex, so the wiring is visible; (3) point it at a copy of a real catalog, never the working tree; (4) verify round-trip fidelity — read, edit, write, then diff the output to confirm ordering, comments, and formatting survive; (5) decide and document the source of truth (files-in-git vs. database) and how the two reconcile during deploys; (6) only then wire into a real repository, behind a protected firewall, on a branch-based workflow with mandatory diff review.
Compatibility. Pin PHP and Symfony minor versions explicitly and test against the LTS target. With 0 dependents there is no ecosystem signal about version compatibility — we must generate that signal ourselves. On the Laravel side, any shared-database approach also couples us to the bundle's Doctrine schema, which is unversioned from our perspective; treat schema changes as breaking changes and add a migration-contract check.
Sequencing — four gates, each with an owner, a time box, and a written stop condition. This is the TPM's main deliverable.
Budget roughly one engineering week across Gates 1–3 plus security-team time for Gate 4. Publish a one-page decision memo at each gate so the outcome is auditable either way — a documented "no" is a successful spike.
Success metrics for the spike, agreed up front: round-trip diff is empty on a real catalog; an edit is visible in the running app after one cache-clear with no redeploy; a non-engineer can complete an edit unaided in under five minutes; admin routes are unreachable without the required role; and the fork/ownership estimate is under an agreed ceiling.
Maintenance — assume we own it from day one. With one likely maintainer and no dependents, the practical model is: pin the version, vendor or fork at the first required patch, and name an internal owner at adoption time rather than discovering the need later. MIT makes the fork legally clean; it does not make it free. Book the ownership cost in the same decision as the benefit, and be honest that "free tool" here means "cheap licence, paid in engineering attention."
Support — community-only, no SLA, no escalation path, no visible advisory process. Acceptable for an internal developer tool used by a small group; disqualifying for anything on the production request path. The hard rule: this authors catalogs, it does not resolve translations at request time. Enforce that boundary in the architecture, not just in the documentation.
Scaling — the risk is write contention, not compute. A low-traffic admin tool will not stress infrastructure. It will, however, break down when several editors or several app instances write the same shared state in parallel: lost updates, and reformatting churn colliding with developer edits. Beyond a handful of editors, move to a branch-and-PR workflow or a database-backed store with locking. On the Laravel sidecar path, add a second scaling caveat — two frameworks reading one schema means every schema change is a cross-team coordination event.
Failure modes to design against, each with a mitigation and an owner:
lint:translations in CI as a release gate; owner: CI/platform.Ramp-up — the asymmetry that should drive the decision. Hours for engineers already fluent in Symfony bundle conventions. Substantial for a Laravel-only team, because the cost is not learning this package — it is learning Symfony's kernel, DI, routing, and security model well enough to secure and operate a privileged admin tool correctly. That gap is why the opportunity score sits where it does, and it is the strongest argument for porting the pattern into Laravel rather than adopting the bundle.
Bottom line for the product decision: this is a low-cost experiment, not infrastructure. It does not fit a Laravel stack and should not be positioned as if it does. If the organisation is Symfony-centric, run a one-week gated spike and be prepared to fork and own. If it is Laravel-centric, take the idea — database-backed, runtime-editable translations behind your existing auth — and build the small version in-house; that delivers most of the business benefit with none of the framework mismatch, vendor risk, or unbounded ownership cost.
How can I help you explore Laravel packages today?