forci/lexik-translation-ui-bundle
Provides a web interface for managing translations with LexikTranslationBundle, letting teams browse, edit, and organize translation messages from a single dashboard. Ideal for Symfony apps that need a lightweight translation admin UI.
Architecture fit — this is not a Laravel package. forci/lexik-translation-ui-bundle is a Symfony bundle: it bootstraps through a Bundle class, a DI extension, and compiler passes, and it relies on Symfony's HttpKernel, Twig, Form, Security, and Doctrine ORM/DBAL. Laravel's container is PSR-11 compliant and Laravel already consumes several Symfony components (HttpFoundation, Console, Finder, Process), but it has no bundle loader, no Twig by default, and no Doctrine entity manager. There is no realistic path to composer require this into a Laravel app. The reusable asset is the domain concept, not the code: a DB-backed translation table edited through a web grid with import/export to files and cache invalidation on write.
Integration feasibility. Three options, in ascending order of effort:
translations table (domain, locale, key, value, timestamps), a custom LoaderInterface so __() resolves DB-first/file-fallback (spatie/laravel-translation-loader already implements exactly this), plus a Filament/Nova/Livewire CRUD screen with import/export. Realistically 3–10 days of work and you own every line.Technical risk — high, concentrated in provenance. Zero stars, zero dependents, NOASSERTION license. That last item is a hard gate: we cannot ship or redistribute code whose license GitHub cannot identify. The upstream (Lexik) is MIT, so the fork probably inherits it, but "probably" is not an answer legal will accept — read the LICENSE file and diff it against upstream before anything else. Secondary risks: single-maintainer fork with no security disclosure channel, no release cadence, and a fork relationship that may already be stale against upstream. Assume we become the maintainers the moment we adopt it.
Key questions.
lang/ files as the source of truth? If so, DB-override semantics need an explicit precedence rule and a rollback story.Stack fit. Mismatch at the framework layer, alignment at the data layer. The bundle's model is a (domain, locale, key, translation) row set with file import/export — that schema is framework-agnostic and is the part worth borrowing. The UI, auth, and cache plumbing are Symfony-specific and should be rebuilt.
Migration path. If we go native Laravel: (1) create the translations table and backfill from lang/; (2) register a DB-backed FileLoader decorator so runtime lookups hit cache-then-DB-then-file; (3) add cache flush on save (tagged or per-locale keys); (4) build the editing screen behind a permission gate; (5) add import/export and an audit trail. If we go sidecar: point the Symfony app at the same database with a read/write Doctrine connection, restrict it to an internal hostname, and document the two-cache invalidation contract.
Compatibility. In the sidecar case, both runtimes must agree on schema (column names, nullability, collation), on locale identifiers (en vs en_US), and on invalidation timing — a Laravel edit that doesn't flush the Symfony cache produces stale copy, and vice versa. Auth is the sharp edge: Symfony Security and Laravel sessions do not interoperate, so the sidecar needs its own IdP integration or strict network isolation. In the native case, watch Laravel's own config/route/view caching against dynamic translation writes.
Sequencing. License review → confirm the requirement is real and not solvable by editing lang/ files → build-vs-sidecar decision → pilot on a single domain (messages) behind a role gate → measure edit latency and cache hit rate → expand to all domains. Do not let this become a blocker for a release; it is a developer-experience tool, not a product dependency.
Maintenance. With zero dependents, we are the only maintainer. Fork internally, pin to a commit SHA, and patch in-house; there is no upstream backport path and no versioning contract to rely on. The native-port option is more code up front but is testable, owned, and readable by the team that will actually be paged.
Support. No community, no issue activity, no security advisories. Documentation is upstream Lexik's, written for Symfony configuration. Budget a short internal runbook: where the table lives, how to flush caches, how to revert a bad import, who owns the tool.
Scaling. Reads dominate. Every __() call is a potential DB hit — load all rows for a locale+domain into Redis on first access and never query per-request. Writes are low-volume (a handful of editors). The admin grid itself is the scaling concern: cross-domain, cross-locale grids generate wide queries and degrade past tens of thousands of keys; paginate by domain and virtualize rows.
Failure modes.
trans_choice at runtime rather than at save time.Ramp-up. A Laravel developer dropped into a Symfony bundle (Twig, DI compiler passes, Doctrine, form types) needs roughly one to two weeks to be productive; building the equivalent Laravel-native screen takes about half that. Combined with the license ambiguity and zero maintenance signal, the recommendation is to harvest the data model and UX pattern, not the dependency — and to treat adoption of the bundle itself as a decision requiring legal sign-off and an explicit internal-ownership commitment.
How can I help you explore Laravel packages today?