dejwcake/craftable-translatable
Adds multilingual, translatable field support to the Craftable Laravel admin panel, letting you manage content in multiple languages with locale tabs and translation-aware form fields. Simple to install and configure for building multilingual admin interfaces.
translations table + validation layer that your team would own forever.HasTranslations implies translated attributes stored alongside the model, which favors the simpler schema: one row per entity, no joins for reads, no whereHas gymnastics. Good trade if you query by entity and render all locales; a worse trade if you need per-locale filtering, sorting, or search at scale — worth validating against your actual query patterns before committing.TranslatableFormRequest means localized fields get first-class validation rules instead of hand-rolled loops in controllers. This is what keeps a partially-translated record from shipping to users — a directly user-visible defect class in multilingual products.Consider it when:
Look elsewhere when:
To executives: This is a small, mature Laravel dependency that handles the mechanical half of launching in new languages — storing translated fields and validating localized form input. The 2.0.1 release is a maintenance patch: no breaking changes, no migration, nothing to schedule. Two things matter commercially. First, it converts "expand into new markets" from an engineering project into a content-and-configuration exercise, which shortens time-to-market for each additional locale. Second, the maintainers added database coverage for PostgreSQL and MariaDB, so adopting it doesn't force a database decision for compatibility reasons. Ongoing cost is near zero: pin the version, upgrade on a routine cadence.
To engineering: Patch release, upgrade is a no-op. Relevant changes: closures in TranslatableFormRequest, HasTranslations::toArray(), and Translatable::getLocales() are now parameter-typed; TranslatableFormRequest::rules() guards the is_array($rule) branch before array_search(), fixing a path that previously ran against string rules too — a real correctness fix in rule matching, and it now has test coverage; and HasTranslations::getLocale() resolves from the container rather than the app() helper, which is the better behavior for testing and for non-default container bindings. Scope check before wide adoption: verify our query patterns don't need per-locale filtering or sorting, since translated attributes stored inline favor read-by-entity over search-within-translation. If that holds, the integration surface is small: a trait on the models, a base form request, and a locale source.
How can I help you explore Laravel packages today?