modera/languages-bundle
A Symfony bundle from Modera for managing application languages and locales. It helps define available languages, centralize localization configuration, and integrate language management into Modera-based admin and content workflows.
id, code, name, enabled flag) plus lookup wiring — roughly a small static reference table behind a trivial service. That's a domain where the PM decision usually resolves to build, because the artifact is ~200 rows of ISO 639-1 data and a repository class. This package is the evidence for that conclusion, not a candidate to install.One caveat that reframes all of the above: this is a Symfony bundle, not a Laravel package. There is no service provider, no publishable config, no Eloquent model, and its 2016-era Symfony 2/3 constraints will not resolve against Laravel 10/11's Symfony 6/7 transitive dependencies. Any "Laravel package" framing in the catalog is a mislabel. The PM-lens value here is entirely as a reference schema and a build-vs-buy argument.
Consider it only in these narrow cases:
Entity/Language.php and the DI extension to confirm your schema and field set before writing your own language service in Laravel. Zero dependency cost, roughly half a day, and it de-risks a design you'd otherwise guess at.Look elsewhere — and you almost certainly will — when:
--ignore-platform-reqs buys a green build and an unverified runtime.[READ-ONLY] subtree split mean no issue tracker destination, no Stack Overflow corpus, no upstream patch commitment. Issues and PRs have nowhere to go — you fork or you don't proceed.symfony/intl (or PHP's Intl / CLDR data, or umpirsky/language-list) supplies locale codes, display names, native names, and formatting, is actively maintained, and is already a transitive dependency in most stacks. Hand-maintaining ISO 639-1 names is the one thing you should not build.Stated as plain criteria: existing Modera/Symfony codebase and no PHP upgrade path in the planning horizon and no appetite for a two-day internal replacement. If any one of those fails, skip it. In practice, at most one will hold.
To executives: Recommend we do not adopt this as a dependency — and flag the catalog entry as mislabeled, since it's a Symfony bundle rather than a Laravel package. The capability is small and static: a table of language codes, names, and an enabled flag, plus lookup helpers. We can reproduce the useful part internally in one to two engineering days, with no license questions, no framework bridge, and no foreign idioms in our codebase. Taking the package instead means inheriting a 2016 artifact with a read-only upstream, no release cadence, no support channel, and framework-version constraints that likely don't resolve on our stack — converting a small feature into a standing remediation line item. There is no upside to trade against that cost. On the plus side, this confirms a genuine ecosystem gap: the composite score is 0.01 against an opportunity score of 23.62, meaning the problem is real and recurring while the incumbent is not viable. That points at build, which is also where the cheaper path lies.
To engineering: Three findings up front. First, stack mismatch — it's a Symfony/Doctrine bundle with no service provider, no publishable config, and no Eloquent integration; consuming it means a Symfony bridge plus Doctrine alongside Eloquent, which is more work than the domain problem itself. Second, abandonment signals — final release June 2016, two stars, zero dependents, read-only subtree split, no upstream issue destination. Third, and most useful: treat the repository as a specification, not a dependency. Read Entity/Language.php and the DI extension, catalog the fields and uniqueness constraints and any default-language/fallback behavior, then implement natively: a languages migration (code unique, name, enabled), an Eloquent model, a cached LanguageRepository, and a SetLocale middleware doing Accept-Language negotiation. Source names from symfony/intl's Languages::getNames() instead of hand-maintaining the list. Ship it behind the same interface so a future swap is a container binding, not a rewrite. Budget one to two days for that path, versus one to three weeks for fork-and-bridge with materially higher ongoing ownership cost and a bus factor of one. If we already carry it transitively in a legacy service, scope a removal ticket, not an upgrade ticket — there is nothing to upgrade to.
How can I help you explore Laravel packages today?