crayon/nova-language-management
A Laravel Nova package for managing your application's languages and translations directly from the Nova admin panel. Add, edit, enable, or disable locales and keep localization files organized without touching code. A lightweight way to handle multi-language sites inside Nova.
Architecture fit. Unchanged by this release. The package remains a Laravel Nova tool, viable only where Nova is already the back office. It adds a database-backed CRUD surface for locales and strings, which implies two architectural commitments: (1) a persistence layer for languages/translations, and (2) a replacement translation loader bound into the container so __() resolves from the database. Release 2.0.2 is described as an "update in language controller" — a Nova-layer change — which reinforces that the package's center of gravity is the admin UI, and that the loader question remains the load-bearing unknown.
Integration feasibility. Still Composer-installable and small in surface area; a two-day spike still establishes viability. The real work remains the loader swap, cache strategy, and authorization over production copy. The community signals have moved slightly, not decisively: a 2.0.2 patch and a second contributor (@ibrammelad, PR #5) indicate the project is not fully dormant, but this is a single drive-by contribution on a package with negligible dependent count and no evidence of production use elsewhere. A patch version also tells us the maintainer does not consider anything here breaking — useful, but it says nothing about Nova 5 or Laravel 11/12 support. Recommendation stands: treat as a reference implementation to fork, not a dependency to trust.
Technical risk. High overall, concentrated in four areas. The staleness signal is downgraded one notch on the strength of an active patch release, but the abandonment risk is replaced by bus-factor risk, not eliminated.
| Risk | Severity | Why |
|---|---|---|
| Loader correctness | High | Fallback chains, pluralization, JSON keys, and vendor namespaces must behave identically to the file loader. A controller-layer patch does not touch this. |
| Runtime dependency on DB | High | A DB outage or slow query degrades every rendered page, not just the admin. |
| Staleness / framework compatibility | Medium-High | 2.0.2 shows maintenance is happening, but there is still no evidence of Nova 5 or Laravel 11/12 validation, and a controller fix cannot provide it. |
| Bus factor / fork continuity | Medium | Effectively one primary maintainer plus one new contributor. Insufficient for us to inherit a support posture. |
| Governance | Medium | No audit trail, no draft/publish workflow, no rollback; edits go straight to production strings. |
Key questions.
LoaderInterface implementation, or only the Nova CRUD screens? If the latter, we own the loader and the caching — the majority of the effort. Nothing in 2.0.2 addresses this.composer.json constraints on laravel/nova, laravel/framework, and PHP? Did 2.0.2 alter them? Is there a stated 2.x roadmap toward Nova 5?vendor::file.key), or only application-level files?Verdict for planning purposes: unchanged — proceed only as a fork, budgeted as an internal mini-project (~10–15 engineer-days), not as a composer require. 2.0.2 marginally reduces upgrade uncertainty and confirms the package is not abandoned, but it does not de-risk the loader, the DB dependency, or governance. If anything, a controller-layer patch strengthens the hypothesis that the loader is our problem to solve.
Stack fit. Assumes Laravel + Nova on MySQL/Postgres with Redis available for caching. Still a poor fit for teams not standardized on Nova, or for multi-tenant apps where translations differ per tenant — the schema almost certainly assumes a single global namespace; verify before committing.
Migration path. Unchanged; dual-read, not cut-over:
lang/ files and keys; establish a baseline count and identify vendor-namespaced groups to exclude.Compatibility. A patch-level release implies no breaking changes and no schema migration, so 2.0.2 does not resequence any of the above. Pin the Nova major version explicitly and confirm the fork's constraints before the spike ends. A controller-only fix does not resolve a Nova 4 → Nova 5 gap; if the package targets Nova 4 and we are on Nova 5, budget the upgrade as part of the fork rather than discovering it mid-integration. Laravel major upgrades will still require re-validating the loader against the framework's Translator and FileLoader internals.
Sequencing. Spike (2d) → go/no-go decision → fork + pin + add tests (3d) → loader + cache (3d) → importer/exporter (2d) → Nova tool registration + authz (1d) → staging bake (1 week calendar) → production. Add a half-day at the front of the spike to read the 2.0.1 → 2.0.2 diff and the PR #5 discussion; the spike must still answer the loader question before anything else is funded, and if the package is UI-only the estimate roughly doubles.
Maintenance. The dominant cost is ownership, not compute. 2.0.2 is a positive signal — the project is receiving patches and has attracted a second contributor — but a single merged PR is not a maintenance commitment, and there is no published roadmap toward Nova 5. The fork is still ours: expect 2–4 engineer-days per quarter for dependency bumps and framework compatibility, plus a concentrated hit on every Nova major upgrade. Assign a named owner; a lightly-maintained upstream does not relieve us of that.
Support. No vendor, no SLA, effectively no community. Internal support means internal tests — write characterization tests around fallback, pluralization, and namespaced keys before trusting the loader in production. Document the loader behavior in the team runbook, because it silently changes how __() behaves for every developer on the project. Note that 2.0.2 changes behavior on the admin side; re-run the editor-facing regression checks after any upgrade rather than assuming patch-level safety.
Scaling. Unchanged. Translation tables are small (thousands to low tens of thousands of rows) and read-mostly, so they cache well. The scaling risk is in the access pattern: a naive per-request SELECT per translation group multiplies query counts across every page render. Preload-by-locale plus a versioned cache key makes this a non-issue; skipping it makes it a pervasive latency tax. Write frequency is low enough that cache stampede is not a real concern, but concurrent edits to the same key need a last-write-wins policy stated explicitly.
Failure modes.
fallback_locale that is guaranteed seeded.Ramp-up. Low for consumers (editors get a Nova screen), moderate for the team: roughly 1–2 days for a developer to internalize Nova tool conventions plus Laravel's Translator/LoaderInterface internals, and another half-day of documentation so the next engineer does not have to reverse-engineer the loader. The organizational risk remains concentrated in the single engineer who builds the fork — pair or document accordingly.
How can I help you explore Laravel packages today?