Laravel Translations v2: A Complete Rewrite from Scratch
I've been working on Laravel Translations for a while now, and the v1 codebase had reached a point where patching things on top of it wasn't sustainable anymore. So I did what every developer eventually does — I rewrote it from scratch.
Why a Full Rewrite?
The original Laravel Translations was built with Vue.js and had a simpler architecture. It worked, but it had limitations that kept coming up:
- No proper role-based access control
- No approval workflow for translations
- The frontend was tightly coupled and hard to extend
- No event system for the Pro package to hook into
Rather than trying to retrofit these features, I decided to start fresh with a modern stack and a proper architecture.

What's New in v2
React + Inertia v2 Frontend
The entire frontend has been rebuilt with React 19 and Inertia v2. This gives us deferred props, prefetching, and a much smoother user experience. The UI is styled with Tailwind CSS v4 and uses shadcn components.
Role-Based Access Control
I wrote a detailed post on how I designed the RBAC system using enums, policies, and middleware — no external packages needed.
v2 introduces four distinct roles:
- Owner — Full admin access, cannot be deactivated
- Admin — Manage translations, contributors, and approvals
- Reviewer — Review and approve translations before export
- Translator — Create and edit translations
You can also assign contributors to specific languages, so your French translator only sees French translations.

Dual Authentication Modes
This was a big ask from the community. v2 supports two auth modes:
- Contributors mode — Uses a built-in
Contributormodel with its own auth system. Perfect for teams where translators don't need access to the main app. - Users mode — Integrates with your existing
Usermodel and auth guard. Great when your team already has accounts.
Approval Workflow
Translations can now require approval before they're exported to language files. This is optional — you enable it in the config and reviewers can approve or reject changes through the UI.
Event System
v2 fires events for everything: TranslationSaved, ImportCompleted, ExportCompleted, LanguageAdded. This is how the Pro package hooks in without modifying core code.
Zero npm Required
One thing I kept from v1: the host application doesn't need Node.js. All frontend assets are pre-compiled and published via the service provider. You install the package, run the install command, and you're done.
Upgrading from v1
If you're on v1, there's an upgrade command that migrates your data:
The upgrade command handles the database migration automatically. Once you're happy, you can clean up the old v1 tables with --cleanup.
What's Next
I'm already working on improvements based on early feedback. Better search, bulk operations, and tighter Pro integration are all in the pipeline.
If you've been using v1, I'd love to hear what you think of the rewrite. And if you're new to the package, there's never been a better time to try it. I also wrote about the lessons I've learned shipping open-source packages if you're thinking of publishing your own.