yeswedev/nova-translatable
A Laravel Nova field for editing translatable model attributes across locales, integrating with spatie/laravel-translatable so you can manage multi-language content directly in Nova forms.
What the package is. yeswedev/nova-translatable is a Laravel Nova form-field package that wraps standard Nova fields (Text, Textarea, Trix, Slug, Markdown, etc.) so that a single JSON-backed column can be edited per locale, typically rendered as locale tabs or a locale dropdown. It is functionally in the same problem space as spatie/laravel-translatable (storage) plus a Nova presentation layer. It exists to solve a real, recurring need: giving content editors a sane UI for multi-locale attributes without hand-rolling a custom Nova field for every resource.
Architecture fit. The package sits at the presentation edge of the stack — it is a Nova field, not a domain library. That is architecturally cheap: it does not touch routing, queues, persistence semantics, or the API surface. Storage remains a JSON column read/written through Eloquent, so the backend contract is unchanged. This is a low-blast-radius dependency if it works, which is the crux of the evaluation.
Integration feasibility. Mechanically trivial — composer require, optional config publish, swap Text::make('title') for the package's translatable wrapper. Realistically, feasibility is gated by provenance rather than effort. The signal set is poor: 2 stars, 0 dependents, a composite score of ~1.14, and an opportunity score of 30.55 (i.e., the scoring model sees a large unmet need in this category and essentially no adoption of this implementation). A package with zero dependents has zero production feedback; there is no evidence base for correctness under Nova upgrades, no issue history to mine for known failure modes, and no community to catch regressions. The near-certain reading is that this is a low-traffic fork or re-implementation of the well-established outl1ne/nova-translatable (formerly OptimistDigital), which has orders of magnitude more adoption.
Technical risk.
spatie/laravel-translatable major versions. Nova's licensing and closed-source distribution make this triangulation harder than ordinary OSS.required rules on a locale the editor never opened can silently pass or silently fail depending on whether hidden tabs are mounted. Confirm behavior explicitly rather than assuming parity with the incumbent.Key questions for the maintainer / before adoption.
outl1ne/nova-translatable? If so, what was changed, and is the diff auditable? If not, why does a second implementation exist?spatie/laravel-translatable versions are supported, and is there a CI matrix proving it?required, unique, and max rules enforced across non-active locales?Stack fit. Appropriate only for a Laravel + Nova admin stack already using JSON-column translations (typically spatie/laravel-translatable). It is not applicable to per-row translation tables, and it has no bearing on public-site i18n or API localization — those remain separate concerns. If the product does not use Nova, this package is irrelevant and the evaluation terminates here.
Migration path. Two scenarios:
outl1ne/nova-translatable): assume API drift. Expect differences in the wrapper constructor, locale-source config key, and how rules are applied per locale. Budget for a resource-by-resource diff rather than a global search-and-replace.Data migration is not required — the JSON column shape is dictated by spatie/laravel-translatable, not by the Nova field. That is the single biggest de-risking factor: the persistence layer is portable even if the field package is not.
Compatibility gate (do this before any code is written).
composer.json constraint admits it.spatie/laravel-translatable major aligns.* or absent, treat that as a red flag and read the source.Sequencing.
outl1ne/nova-translatable) — it solves the same problem with a real adoption base. This package's low score is a reason to compare, not to reject outright, but the burden of proof sits with the challenger.Keep the wrapper calls isolated behind a thin internal helper or a single resource trait so that whichever package wins, the swap surface stays one file.
Maintenance. The dominant cost is not the code — it is ownership. With 2 stars and no dependents, assume you are the maintainer from day one. That means vendoring, owning Nova-upgrade compatibility, and absorbing any upstream silence. Budget a recurring, low-frequency but non-zero line item: every Nova major and every spatie/laravel-translatable major becomes your upgrade. Compare that to the incumbent, where the community absorbs most of that cost. If the audit shows this package is a near-identical fork, the operating model is "we forked for a reason; document the reason or don't fork."
Support. No meaningful upstream support channel. Internal runbook required: who owns the fork, where the pinned version lives, how to patch. Editors will file bugs against the tab UX, and those bugs route to your team, not to a vendor.
Scaling. Runtime cost is negligible — it is form rendering and a JSON column read/write. The scaling concern is editorial, not infrastructural: rendering N locale tabs multiplies form fields and payload size linearly. At 3–5 locales this is invisible; at 15+ locales per resource the Nova edit screen becomes slow and cognitively hostile, and per-field validation cost grows. Also note JSON-column translation is a deliberate trade-off: it optimizes write simplicity and degrades query/index flexibility. If translated content needs to be filtered, sorted, or full-text searched per locale at scale, revisit the storage model — and no Nova field package can fix that.
Failure modes.
app.locale, silently collapsing a multi-locale form into a single-locale one; editors won't notice until content is wrong.Ramp-up. Low for anyone who has used Nova: the mental model (wrapper field + locale source + JSON storage) transfers directly, roughly half a day for a mid-level Laravel developer. The non-obvious parts — how fallback locales behave on save, how rules apply per locale, and where the locale list is configured — are exactly the parts with no docs and no issue history to consult, so they must be written down internally during the pilot. Front-end/content-editor ramp-up is the real workstream: locale tab conventions, fallback expectations, and a "what does an empty tab mean" policy need to be decided by product, not discovered by editors.
Recommendation. Do not adopt on the strength of this package's own signal — 2 stars and 0 dependents is insufficient evidence for a dependency that touches editorial content integrity. Run the provenance audit first; if it is a clean, maintained fork with a documented reason to exist, a one-resource pilot is justified. Absent that, the same requirement is met by the established incumbent with materially lower ownership cost, and no architectural decision here forecloses switching later — the JSON storage layer is portable either way.
How can I help you explore Laravel packages today?