happenv-com/filament-translatable
Filament Translatable provides a complete solution for managing multilingual content in Filament admin panels, adding intuitive tabbed translatable form fields with multiple translation backends, configurable locales, and support for Filament 3, 4, and 5.
spatie/laravel-translatable (JSON column) and astrotomic/laravel-translatable (side table) means the package does not force an early, hard-to-reverse schema decision. You can pick per project or per model, and switch via a translationMode enum without ripping out form code.requiredLocale, requiredDefaultLocale), per-locale field decoration (currency suffix/prefix per language), and locale labels on field names reduce "content shipped in the wrong language" defects — a real support-cost and brand-risk item, not just a nicety.->locales(fn () => Language::pluck(...))) allow product-specific workflows — e.g., an editorial "mark as reviewed" action per language, or locales driven by a tenant/language table — without forking.Adopt it when:
translatable() macro means a single method call per field, with an escape hatch to the full Translations component for complex multi-field layouts.Look elsewhere or build in-house when:
For executives — the one-paragraph version: Our admin panel is built on Filament, and every market we launch requires editors to enter content in multiple languages. Today that means either custom admin code or awkward repeated fields — both slow us down and produce missing-translation bugs. This open-source (MIT, zero license cost) package gives us a proven, tabbed per-language editing experience out of the box, works with either of the two standard Laravel translation libraries so we are not locked into a schema choice, and lets us enforce "this field must be filled in English" rules per language. The trade-off is maturity: it is a small, young project, so we pin the version, keep the integration thin, and treat it as a swappable UI layer rather than a foundation. Estimated saving is engineering days per localization launch, against near-zero cost and low switching risk.
For engineering — what you are actually signing up for:
A form-layer package, not a translation platform. Install, publish assets, register the plugin in the panel, set locales and default locale. Models keep using Spatie or Astrotomic (with the package's own AstrotomicTranslatable trait substituting for Astrotomic's). Per-field usage is one ->translatable() call; complex layouts use the Translations component with named instances. Per-locale required rules, per-locale field decoration, and locale-labeled tabs are configuration, not code.
Known sharp edges to state openly, not bury:
required() must be called before translatable(), because the method switches context from the field to the Translations component — an easy source of silent misconfiguration.Translations instances on one form require distinct names.Recommendation: approve as a contained, reversible dependency for the admin panel, with a version pin and an internal note on which models use which translation mode. Do not extend it to customer-facing localization, and do not let it become the reason a translation schema decision is made.
How can I help you explore Laravel packages today?