apility/filament-localizable-resources
A Filament plugin that makes resources localizable: translate resource labels, navigation, form and table fields per locale, and switch languages without duplicating resources. Integrates with spatie/laravel-translatable-style workflows to keep multilingual admin panels clean.
Architecture fit. This is a thin presentation-layer package: it does not introduce a service, a datastore, or a runtime dependency, and it assumes (rather than owns) the translation storage layer — typically spatie/laravel-translatable with a JSON translations column. From a product-architecture standpoint that is the right shape. The localization capability an admin needs (per-locale tabs, fallback behavior, locale-aware columns) is added on top of resources you already run, so the blast radius of adoption is limited to the resource classes you opt in. It is a build-vs-buy decision that resolves cleanly toward "buy the UI layer, own the data layer."
Integration feasibility. Low effort to prove out: install, pin Filament and the package together, register locales in one config location, convert a single small resource with two translatable fields. That spike answers the only question that really matters pre-commitment — whether the package's default UX is tabs-per-locale or per-field locale inputs, since those produce very different editorial workflows and the wrong one is expensive to unwind. A half-day spike and a one-to-two-day integration for the first resource is a realistic planning number.
Technical risk. Ranked:
->searchable() and sortable translatable columns hit the raw JSON column and return cross-locale nonsense; unique rules don't work per locale. The package does not solve this, so it is real engineering scope that must be scoped alongside adoption or the localization story will be judged broken at launch.Key questions to close before committing.
composer.json actually constrain, and is a v4 path planned? Pin from the manifest, not from the README.Stack fit. Laravel + Filament panel, translation storage already in place. No new infrastructure, no external service, no data migration. It aligns with Laravel translation conventions rather than inventing a parallel model, which keeps the exit cost low — removing the package leaves your resources and data intact.
Migration path. There is no schema migration. The change is additive at the code layer and disruptive only at the workflow layer: editors move from single-locale forms to per-locale tabs, and existing resource form schemas need re-shaping. Treat this as a UX change-management item, not a technical migration. v1.0.2 is a patch bump with no advertised breaking changes, so there is no coordinated upgrade to schedule.
Compatibility. Verify the PHP/Laravel/Filament matrix explicitly and pin ~1.0.2 in production. Put the package plus Filament in a CI matrix so a Filament minor bump surfaces as a red build rather than a production regression. Because release notes are thin, CI is the real compatibility contract.
Sequencing.
Page with translatable title/body), editor-visible, behind a flag if possible.json_extract, or Scout) as a separate tracked workstream.Decision gates. Go/no-go after the spike on two criteria: does tab-per-locale match how your editors actually work, and does the integration survive a Filament minor bump in CI? If either fails, the fallback is to keep translations in the model layer and defer the admin UX.
Maintenance. The package itself is small and cheap to maintain. The surrounding plumbing is not: search indexing, sort behavior, unique validation, and locale session state all become yours to own. Budget for the plumbing, not the dependency. Pin exact-ish versions in production and let CI catch Filament bumps.
Support. Expect a recurring "I saved it but it shows empty" ticket stream driven by read-time fallback semantics. Pre-empt it with a one-page internal convention doc and translated attribute names in lang/*/validation.php, otherwise editors see mixed-language validation errors. Editorial onboarding is a short guide, not a training program.
Scaling. Fine at typical admin content volumes. Two ceilings: query behavior (calling getTranslation() in table column closures across a page of rows invites N+1 unless relations are eager-loaded) and locale count — tab-per-locale is workable at two to four locales and becomes unusable past roughly six, at which point the UX, not the package, is the constraint. If the roadmap points at many locales, revisit the interaction model before scaling the locale list.
Failure modes. Filament upgrade breaks the schema API; search and sort return cross-locale garbage at launch; locale state leaks across panels or tenants; missing translations present as silent blanks rather than errors; package goes dormant. The last one is mitigated by MIT licensing and a small source surface — vendoring or forking is a realistic contingency rather than a rewrite.
Ramp-up. Low for engineers already fluent in Filament: half a day to spike, one to two days to integrate the first resource, then incremental per-resource work. Ongoing operational load is negligible once the fallback convention and search/sort handling are settled.
What to instrument. Number of locale-gap tickets opened by ops, time from spotting a locale gap to shipping the fix, and any post-launch sort-or-search defects on translatable columns. Those three metrics tell you whether the package delivered the intended outcome — moving translation work out of the engineering backlog and into the admin — or merely relocated it.
How can I help you explore Laravel packages today?