thettler/extended-localization
Extended localization for Laravel: manage translations in the database, add localized routes and locale switching, and extend Laravel's built-in localization with flexible, developer-friendly tools.
Scope of this assessment. This is a baseline (there is no prior assessment on file), triggered by the publication of v0.0.7. The release note body contains only an autogenerated Full Changelog compare link — no summary, no migration note, no deprecation notice, no CVE reference. Everything version-specific below is therefore flagged as verify by diffing v0.0.6...v0.0.7 rather than asserted from the notes. That absence is itself the single most important finding of this review.
Architecture fit.
lang/ message translation.Accept-Language headers.Integration feasibility.
0.0.x, Composer treats 0.0.7 → 0.0.8 as a potentially breaking change under semver, and the release notes give you no way to tell whether it was. Every bump requires reading the commit log.Technical risk.
0.0.x carries no compatibility promise. Any patch can rename a facade method, a route macro, or a config key.route:cache and with duplicate route names across locales — must be proven, not assumed.Key questions (answer before adoption).
v0.0.7? Diff the tags; check for renamed public methods, config keys, route macros, and minimum PHP/Laravel constraints.route:cache, Octane, and queued/scheduled contexts where there is no request to derive a locale from?1.0, or is this a personal project with no support commitment?mcamara/laravel-localization) on the exact features we need?Stack fit. Appropriate for a conventional Laravel monolith or modular monolith where routing is server-rendered and locale lives in the path. Verify before committing: Laravel version pin in composer.json, PHP floor, and whether route registration happens in a service provider (compatible with config/route caching) or at boot in a way that defeats it. Front-end implications matter too — if the app uses Inertia/Livewire, confirm locale survives client-side navigation and that URL generation returns locale-correct links.
Migration path. Two realistic origins:
App::setLocale): lowest-risk origin. The package formalizes what you already do; migration is per-route-group and reversible group by group.mcamara/laravel-localization: do not treat this as a drop-in. Both packages own route registration and URL generation; running them concurrently produces duplicate route names and ambiguous URL helpers. Migrate wholesale, route group by route group, behind a feature flag, with the old package removed in the same change.Either way, pin the exact version ("0.0.7", not ^0.0.7) and commit the lock file. Under 0.0.x a caret constraint is a live grenade.
Compatibility. Treat compatibility as unverified until the diff and the CI matrix are read. Specific things to prove in the spike: route caching round-trip (route:cache → route:clear), URL generation for every locale, fallback locale for unmapped segments, coexistence with any signed-URL or localized-email flows, and interaction with existing redirect/HTTPS middleware ordering.
Sequencing.
v0.0.6...v0.0.7; read the full commit history back to first tag; record every public-surface rename. Output: a one-page API stability estimate.hreflang are validated. Localized URL changes are search-visible regressions if mishandled.Maintenance. The steady-state cost is not patching — it is reading. Expect to spend 30–60 minutes per release reconstructing intent from commits because the changelog will not tell you. Budget roughly one engineering day per quarter for dependency review, plus unbounded time if a minor bump changes route semantics. The internal adapter from step 3 converts a potential multi-day refactor into an afternoon.
Support. No vendor, no SLA, no security response process. Support model is: read the source, open an issue, or fork. Acceptable for internal tooling and non-revenue locales; questionable for anything where a broken localized URL is a revenue or compliance event. If the app serves regulated markets, document an exit plan now, not during an incident.
Scaling. Functionally, the package scales with route count, not traffic — route registration is a boot-time concern, so watch cold-start and route:cache behavior as route groups multiply, especially under Octane where boot work is amplified. Organizationally it does not scale past one or two people who understand the locale-routing model; that knowledge must be written down. Architecturally, per-locale route trees grow combinatorially — ten locales × two hundred routes is a maintainability problem the package does not solve for you.
Failure modes (ranked by expected damage).
hreflang, canonical pointing at the wrong locale. Slow to detect, expensive to unwind.route:cache in CI.0.0.x patch. Detect by pinning and failing the build on lock-file drift.Ramp-up. One to two days for a Laravel-fluent engineer; the concepts (locale prefixes, translated segments) are familiar. The real ramp is institutional: whoever owns i18n must own the locale matrix, the fallback policy, the SEO contract, and the upgrade discipline. Onboarding cost is low; offboarding cost is high without written-down locale conventions — write them in the same PR that introduces the dependency.
Recommendation. Proceed to a time-boxed spike with the version pinned; withhold production commitment until (a) the v0.0.6...v0.0.7 diff has been read and the public API surface documented, and (b) route caching and URL generation are proven in CI. Wrap it in an adapter from day one. The package's capability is real and the integration is cheap; the risk is entirely in the release process and the bus factor, and both are mitigated by how you adopt it, not by what it does.
How can I help you explore Laravel packages today?