propaganistas/laravel-intl
Laravel Intl adds convenient internationalization helpers to Laravel: format numbers, currencies, percentages, dates and phone numbers using the intl extension, with Blade directives, validation rules and locale-aware formatting throughout your app.
Architecture fit. propaganistas/laravel-intl is a thin, opinionated convenience layer over PHP's ext-intl and ICU data, plus giggsey/libphonenumber-for-php for phone semantics. It ships as a standard Laravel package: a service provider, optional config publish, and a set of static helper/facade-style APIs (PhoneNumber, Currency, Number, Language, Territory, Subdivision). Architecturally this is a low-coupling utility library, not a framework-level concern — it slots beside formatting/validation code rather than reshaping domain models. That is attractive for a TPM because it makes the package easy to trial, easy to isolate, and easy to remove.
Integration feasibility. Adoption is a single composer require plus confirming ext-intl is compiled into every runtime (local, CI, container, production). No database migrations, no queues, no external services, no credentials. The only meaningful integration surface is the version constraint against the host Laravel/PHP version and the ICU version baked into the base image, which determines available locales and formatting behavior. Realistically a mid-level Laravel engineer can spike this in under a day.
Technical risk. The dominant risks are not code risk but supply-chain and environment risk:
libphonenumber data and host ICU libraries are. This becomes a recurring maintenance obligation rather than a one-off install.laravel-phone), but a TPM should not treat a zero-signal dataset as due diligence. Verify Packagist download counts, release cadence, open-issue posture, and the actual GitHub repo before committing.Key questions for the maintainer/vendor review.
libphonenumber-for-php bumped, and is that a transitive constraint we control or inherit?Stack fit. Best fit is a Laravel application or Laravel-based service that already serves multiple locales or regions: localized pricing display, phone capture and normalization, country/territory selectors, language pickers. It is a poor fit for a polyglot estate where only one service is PHP, because it introduces a formatting inconsistency across services — in that case standardize on a shared formatting contract (BCP 47 locales, E.164 phone numbers) and let each runtime implement it.
Migration path. Treat this as a strangler-style replacement of homegrown helpers, not a big-bang rewrite:
number_format calls, regex phone validation, hardcoded currency symbols, country dropdown arrays.App\Support\Formatting) so call sites depend on our interface, not the vendor's.Compatibility. Pin the package version explicitly and lock it in composer.lock; validate that every environment (dev containers, CI image, production base image) has the same ext-intl/ICU build, otherwise locale output will differ between environments in ways that are hard to diagnose. Ensure ext-intl is declared in composer.json require so failures surface at install time rather than at runtime. Verify the phone-number library's data version is pinned and updated deliberately.
Sequencing. (1) Due-diligence spike and license check. (2) Environment audit for ext-intl and ICU versions across all stages. (3) Pilot on one non-critical surface — ideally a country/language selector or display-only currency formatting, not payment math. (4) Expand to phone normalization once exception handling is proven. (5) Full adoption behind the internal adapter, with the legacy helpers removed. Deliberately keep monetary calculation out of scope; formatting is display-only and should never be the source of truth for amounts.
Maintenance. Low ongoing engineering effort, but not zero. Budget a recurring dependency-update task: Composer bumps, phone-number data refreshes, and a review on each Laravel major. Because formatting output is user-visible, updates are worth a lightweight visual/regression check rather than trusting green CI alone. Assign a named owner so the package does not silently rot.
Support. Support burden is low and mostly self-inflicted: developer questions about which helper to use, and occasional tickets about a specific locale formatting "incorrectly" when the root cause is stale ICU data in a container image. Mitigate with a short internal README documenting the adapter, the supported locale list, and the escalation path for locale bugs.
Scaling. Effectively negligible. The package is stateless and CPU-bound on formatting operations; no I/O, no external calls, no cache dependency. At high request volume, hot paths (e.g., formatting a price on every item in a large catalog response) benefit from memoizing formatted strings per (value, locale) pair, but this is an application-level optimization, not a package limitation. Horizontally scales trivially since there is no shared state.
Failure modes to plan for.
ext-intl in a newly provisioned environment — causes hard failures at class load or call time. Guard with an install-time requirement and a startup health check.Ramp-up. Very low. A Laravel developer familiar with the framework is productive in hours; the API is idiomatic and discoverable. The real onboarding cost is conceptual, not syntactic: the team needs a shared understanding of when to format (display boundary, not domain layer), how to store canonical values (E.164 for phones, minor units or decimal strings for money, BCP 47 for locales), and why the adapter exists. Document those three rules and the package effectively disappears into the background — which is the correct outcome for a utility of this kind.
How can I help you explore Laravel packages today?