pmochine/laravel-tongue
Laravel Tongue is a lightweight localization package for Laravel that simplifies multilingual routes and language switching. Define translated URLs, detect and persist the visitor's locale, and serve localized content with minimal configuration.
localizedRoutes() gives each locale its own translated URL (e.g. /bienvenue vs /welcome), so launching a new country/language becomes a routing configuration decision rather than a bespoke engineering project per market.speaks-tongue redirects with 307 for form requests, preserving method and payload. That is the difference between "localization broke our signup form" and "localization shipped without incident" — a real risk item on any checkout, onboarding, or lead-gen funnel.Adopt when:
/fr/bienvenue outperforms /fr/welcome.Look elsewhere or supplement when:
detects-tongue / speaks-tongue running before SubstituteBindings). It's well-designed, but it is an architectural contract worth understanding, not just installing.For executives: Localization is a growth lever, and the routing layer is where most localization projects quietly stall. The 6.1.0 release removes the two blockers that typically force a "we'll do i18n next quarter" deferral — it now works with production performance infrastructure (route caching and Octane) and it doesn't break forms during locale redirects. Net effect: entering a new market becomes a configuration and content exercise, not a platform rebuild. The build-vs-buy math favors adopting this over hand-rolling locale routing.
For engineering: This release closes the production-readiness gap. localizedRoutes() registers translated routes once per locale, making route:cache and Octane viable with localized URLs — previously a hard blocker. The speaks-tongue middleware redirects to the current locale's path and returns 307 on form requests, preserving method and body. Middleware ordering now places both detects-tongue and speaks-tongue before SubstituteBindings, so route-model binding resolves translated slugs in the request's locale and redirects fire before a binding can fail. dialect()->redirect() now accepts an explicit status code for cases where 307 isn't right. Low integration risk, clear upgrade path, and it eliminates a meaningful amount of custom routing code we'd otherwise own and maintain.
How can I help you explore Laravel packages today?