ruwork/template-i18n-bundle
Symfony bundle that brings internationalization to templates, letting you translate template strings and manage locale-aware content. Integrates with Symfony's translator and Twig to keep multi-language templates clean and organized.
Verdict up front: do not adopt. This is not a Laravel package, it is an archived Symfony bundle with no maintenance, no consumer base, and a release history that stops five Symfony major versions ago. The only realistic decision is whether any of its behavior is worth reimplementing natively — and that is a half-day spike, not an integration project.
Architecture fit — poor, and the framing is wrong. The name and the Bundle suffix indicate a Symfony full-stack artifact: bundle class registration in AppKernel/bundles.php, service definitions in the DI container, likely a Twig extension or template-loading hook, and probably an event subscriber on the kernel or templating layer. Laravel's equivalents (service providers, Blade compilers, view finders) are structurally similar but semantically incompatible — Laravel has no bundle system, no container compilation pass, no symfony/templating layer. Porting means rewriting the integration surface, at which point you own 100% of the code and have inherited only the design idea, not the package.
Capability overlap is also a concern. Laravel already ships first-class localization (lang/, __(), trans_choice, pluralization, JSON keys) and per-locale view resolution is achievable with a custom view finder in well under a day. If this bundle's value proposition is "translate template files per locale" rather than "translate strings," that is a genuine gap in Laravel's defaults — but it is a ~200-line gap, not a dependency-worthy one.
Integration feasibility — low. Three independent blockers:
| Blocker | Detail | Severity |
|---|---|---|
| Framework mismatch | Symfony bundle primitives have no Laravel counterpart; requires a compatibility shim or rewrite | High |
| Maintenance status | Archived; last release 2018-07-20 | High |
| Dependency constraints | 2018-era composer.json will pin Symfony/Twig/PHP ranges that conflict with any current stack; expect hard resolution failures, not warnings |
High |
The dependency point is the practical killer. Composer will refuse to install alongside Symfony 5/6/7 or Twig 2/3, and if you force it with --ignore-platform-reqs or an inline alias you are running 2018 code on PHP 8.x, where it will likely fatal on removed constructs (each(), curly-brace string offsets, deprecated dynamic properties). Any Laravel 10/11 application is a non-starter.
Technical risk — high, concentrated in unknowns. Zero stars and zero dependents means zero production feedback: no issue history to mine for edge cases, no security advisories, no one to notice a CVE. Archived means no upstream patch path — any defect becomes your defect on day one. The MIT license is the one clean element: forking is legally unencumbered, which is exactly why "fork it" is the wrong answer here — if you fork, you are not adopting a package, you are starting an internal project with a stranger's untested code as its seed.
The opportunity: 5.87 score should be discarded. It is an artifact of a scoring heuristic operating on an empty signal set (zero stars, zero dependents, zero recent activity); it carries no information about fitness.
Key questions to resolve before closing the ticket:
trans filter wrapper, or locale-aware caching? The description is uninformative and this determines whether there is any capability to replicate at all.symfony/translation template features, laravel/lang, community locale-aware view finders) that covers the same ground?composer.lock files.)Stack fit — none. There is no supported path from a 2018 Symfony bundle into a modern Laravel application. Even a Symfony-shop evaluation lands on the same conclusion: the bundle targets Symfony 3/4-era APIs and an archived status means no forward port exists or is coming. The stack fit is a historical artifact, not a current option.
Migration path — inverted. Normally a TPM sequences "adopt → stabilize → localize." Here the only coherent sequence is "extract → reimplement → own," and only if the key questions above surface real value. The realistic flow:
ViewFinderInterface implementation. Most likely outcome: the delta is small and the native version is cheaper than any shim.Compatibility — the hard stop. Do not attempt --ignore-platform-reqs or inline aliases to force installation. A 2018 bundle on PHP 8.x is a runtime-fatal generator, and the failures will appear in production paths (template rendering, cache warmup) rather than at install time. If a stakeholder insists on a proof-of-concept, isolate it to a throwaway Symfony-3-compatible container and treat it as documentation, never as a deployable.
Sequencing note for a Laravel shop: localization infrastructure is best introduced before the template layer needs it, so the view finder and the string catalog share a fallback policy. If we are going to touch i18n at all, do it as one coherent piece of work rather than bolting a per-locale template mechanism onto an existing string-only setup.
Maintenance — total, uncompensated. Archived means the maintenance burden transfers to us in full at the moment of adoption. Estimate: an inherited codebase of unknown quality, no tests of unknown coverage, no CI, no upstream, and a PHP-version migration already overdue by multiple majors. Compare against the native alternative, which is a few hundred lines we wrote, we understand, and whose tests we control. The maintenance comparison is not close.
Support — none. No maintainer, no issue tracker activity, no security advisory feed. If a CVE lands in a transitive dependency, we discover it via our own scanning with no upstream to patch. This is a governance problem as much as an engineering one; in regulated or customer-facing contexts, an unmaintained dependency with zero dependents is a finding in an audit, not a footnote.
Scaling — a non-issue masking a real one. Runtime scaling is irrelevant: this is a template-layer concern with no DB, no network calls, and negligible per-request cost. The scaling risk is organizational — a single unmaintained dependency becomes a single point of failure for every localized page, and its bus factor is zero. If per-locale template resolution sits on the critical rendering path, an unhandled edge case degrades all localized traffic simultaneously, not a subset.
Failure modes to plan for:
| Failure | Trigger | Blast radius | Mitigation |
|---|---|---|---|
| Composer resolution failure | Any install against modern Symfony/Twig | Blocks the build entirely | Treat as a hard stop; no workarounds |
| PHP 8 fatal errors | Runtime, on deprecated constructs | Template rendering path | Not mitigable; another reason to reject |
| Silent fallback to default locale | Missing per-locale template | Content shows wrong language, no error | Assertion tests on every locale-key pair; alerting on fallback rate |
| Cache key collisions across locales | Locale-insensitive cache keys | Users see another locale's page | Locale in every cache key; integration test with cache warmup |
| Escaping/autoescape regressions | Twig-version mismatch in a ported extension | XSS exposure | Do not port Twig internals; use Blade's escaping contract |
The silent-fallback and cache-collision modes are the ones that reach users and are the ones an unmaintained package gives you no help detecting. Any implementation, native or borrowed, needs an explicit fallback metric and a locale-in-cache-key assertion in CI.
Ramp-up — deceptively shallow. The API surface is small, so a developer can be productive in hours; that is precisely the trap. Reading the code is fast, but there is no documentation, no changelog beyond the single 2018 release, and no way to distinguish intentional behavior from bug. Ramp-up cost is not in learning the API, it is in reverse-engineering intent — and that cost lands on whoever inherits the integration eighteen months from now.
Bottom line for planning: zero engineering days allocated to integration. Budget one day for a timeboxed spike and a written decision record, default to a native implementation if the capability is genuinely needed, and close the evaluation with "rejected — archived, framework-mismatched, zero ecosystem signal." Flag the opportunity score as unreliable in the writeup so the same package does not resurface in the next tooling review.
How can I help you explore Laravel packages today?