mominalzaraa/filament-localization
Automatically localize your Filament app: this package scans resources, fields, columns, actions, and components, then generates structured translation files—eliminating the repetitive manual work of adding translation keys. Requires PHP 8.3+, Laravel 12/13, Filament 5.
TextInput, TextColumn, Section, action labels across every resource, page, and relation manager) into one reviewable command. A PM can use a --dry-run spike to produce a real estimate — "N files touched, M keys generated" — instead of guessing at a multi-sprint i18n backlog.spatie/laravel-translatable plugin), and it does not ship a locale switcher (it delegates that to a third package). This clarity is useful for splitting one giant "make the app multilingual" ask into three independently-scoped decisions with different owners and risks.Good fit:
--dry-run, --panel scoping, automatic backups, and git commits with easy revert are the right safety primitives, but they only pay off if someone actually reads the output.Look elsewhere when:
__() calls are cheaper than adopting, configuring, and auditing a dependency.Recommendation: timeboxed spike, not adoption. Run filament:localize --dry-run against the single largest panel, inspect the diff for correctness and readability, and compare a translated slice with the manual baseline. Gate the real decision on that diff quality and on the stack-upgrade timeline.
Executives (one paragraph): We're evaluating a small, MIT-licensed open-source tool that mechanically converts hardcoded admin-panel labels into translatable keys, optionally auto-translating them. It targets the tedious 80% of localization work — the part that is high-volume, low-judgment, and easy to underestimate. It's reversible by design (dry-run mode, backups, git commits), free, and doesn't lock us in. The counterweight is maturity: it's a new project with a single maintainer and essentially no public adoption, built only for our newest framework versions. So the ask is a few days of engineering to validate on one panel — not a commitment to a vendor or a platform. If the generated code is clean, it converts a multi-sprint localization epic into a short cleanup pass plus translation review; if not, we lose a spike and do it manually.
Engineering: This is an automated refactor, not a runtime dependency. It rewrites resource and page files — nulls out static labels and generates getX() accessors returning __() keys — and emits structured lang/ files using a configurable layout (panel-based recommended; flat and nested available). Safety rails we'd rely on: --dry-run, --panel/--locale scoping, --force to overwrite, --no-git for controlled commits, backups, and excluded_panels/excluded_resources config. The DeepL command is isolated and opt-in via DEEPL_API_KEY, with a skip_identical_terms list that sensibly protects acronyms and brand names — and --dry-run there too. What we need from a spike: diff quality on our most complex resource, behavior on any custom components, and whether the generated key namespace survives a second run without churn. Treat it as a forked tool — vendor the config, pin the version, and assume we maintain it.
How can I help you explore Laravel packages today?