backtik-ch/filament-translatable
Filament plugin for managing translatable Eloquent fields in admin panels. Adds locale-aware form inputs and tabs so you can edit multilingual content alongside your resources, making translation workflows simpler for Filament apps.
Architecture fit — The package is a UI-layer plugin for Filament panels: TranslatableInput (form field) and TranslatableEntry (infolist entry) wrap the multilingual editing surface, while a panel plugin centralises language list, source locale, and AI provider/model configuration. This is a thin presentation layer over whatever persistence strategy the host app already uses (JSON columns or a translation table), which is the right architectural boundary — it means adopting it does not force a data-model rewrite. The AI translation capability delegates to laravel/ai, so the vendor/credential surface stays in the Laravel ecosystem rather than being bespoke to this package. Fit is strongest for teams already standardised on Filament as their admin framework; fit is poor for teams using Nova, custom Livewire admin, or headless/API-only content workflows, where the value proposition collapses to "a form widget we cannot use."
Integration feasibility — Drop-in for Filament 4/5 panels: register the plugin in the panel provider, configure locales once, and annotate fields/entries. The two presentation modes per component (modal default vs. inline for inputs; inline-expandable vs. modal for entries) give per-screen control without code forks, and ->lineClamp() is a small but real UX win for dense infolist tables. AI translation is a single API call for all locales, which is operationally attractive versus N-call fan-out, but it introduces an external dependency and a credential/config path that must be provisioned per environment. Estimated integration effort is low (days, not weeks) for a single panel; the real effort is in content governance, not code.
Technical risk — Primary risk is maturity: this is 0.1.0, pre-1.0, meaning no semver stability guarantee and a plausible API churn window as the author refines the plugin contract. Secondary risks: (1) Filament 4 and 5 support in a first release suggests a compatibility matrix that is asserted rather than battle-tested — verify against the exact minor you run; (2) laravel/ai is itself an early-stage dependency, so you inherit its release cadence and any provider-side changes; (3) AI-generated translations are unreviewed content by default — without a draft/review state, machine output can reach production copy; (4) single-call batch translation means one failure or timeout loses the whole batch rather than degrading per-locale; (5) unclear per-field persistence contract — whether the package owns the storage shape or merely renders it determines lock-in.
Key questions — Does the package define or assume the underlying storage schema (JSON column vs. relation), and can we swap it? Is there a hook to force human review before AI translations are saved/published? What is the per-call token/cost profile, and is there per-locale retry or partial-success handling? Which exact Filament minor versions are CI-tested, and what is the maintainer's stated 1.0 timeline and backward-compatibility policy? Does laravel/ai support our required provider(s) and data-residency constraints (i.e., is content leaving our jurisdiction)? Is there an escape hatch to bypass the modal/inline UI and render translations read-only for non-editor roles?
Stack fit — Assumes Laravel + Filament 4/5 + Livewire, PHP 8.x, and a persistence layer for translations already in place. The laravel/ai dependency implies a configured AI provider with credentials, plus egress to that provider from the app environment. Teams with strict no-third-party-egress policies for CMS content will need to disable the AI feature and use the field components only — confirm the AI path is opt-in and not auto-wired at boot.
Migration path — Low-risk, additive adoption. Recommended: pilot on a single non-critical resource in a staging panel, with AI translation disabled initially, to validate the persistence contract against existing multilingual data before enabling generation. Existing translations should render unchanged if the plugin is purely presentational; if it imposes a schema, plan a backfill. Because it is pre-1.0, pin an exact version (0.1.0) and avoid floating constraints.
Compatibility — Pin Filament to a minor you have verified; do not assume both 4 and 5 are equally exercised. Check laravel/ai version constraints against your framework version and PHP runtime. Verify the plugin coexists with any existing translation package (e.g. spatie/laravel-translatable) rather than replacing it — if both claim the same fields, expect conflicts.
Sequencing — (1) Pin versions and confirm Filament minor compatibility in a scratch branch. (2) Register the panel plugin and configure locales/source locale; no AI. (3) Convert one resource's form + infolist; validate read/write round-trip against existing data. (4) Add role/permission gating so only editors see editing modes. (5) Enable AI translation in staging with a review gate or draft state; measure cost and quality on one locale pair. (6) Roll out resource-by-resource, with a documented fallback to the prior editing UI.
Maintenance — Ongoing cost is tracking two fast-moving upstreams (Filament majors and laravel/ai) plus a pre-1.0 plugin. Budget for a compatibility pass at each Filament major and at plugin minor bumps; treat upgrades as planned work, not incidental. Because the package is small and UI-scoped, the blast radius of a broken upgrade is confined to admin screens, not public rendering — that materially lowers maintenance severity.
Support — Single-maintainer GitHub project with no stated SLA. Internal ownership should sit with the team that owns the admin panel; document the panel-plugin configuration (locales, provider, model) as internal config-of-record, and record the pinned version and rationale. Vendor support for translation quality is nil — that is your editorial team's responsibility.
Scaling — UI scaling is a non-issue (admin traffic is low). AI translation scales in cost and latency, not throughput: one call per record per save-trigger, growing linearly with content volume and locale count. Add rate limiting, caching of unchanged source content, and a batch/queue path for bulk backfills rather than synchronous generation on form submit. Large locale sets (10+) will make modal/inline UX and single-call payloads unwieldy — cap enabled locales per panel.
Failure modes — (1) AI provider outage/timeout: whole-batch failure; ensure the form still saves source-locale content and surfaces a retry. (2) Provider credential expiry or quota exhaustion: silent degradation to manual entry — alert on it. (3) Filament minor upgrade breaking the plugin: admin editing unavailable; mitigate with version pinning and a staged upgrade branch. (4) Unreviewed machine translation reaching production copy: mitigate with a review/draft gate or human-approval step before publish. (5) Locale misconfiguration in the panel plugin causing missing or mislabelled fields: validate config at boot. (6) Persistence-contract mismatch writing malformed translation payloads — take a DB snapshot before the pilot.
Ramp-up — Developer ramp-up is under a day (plugin registration plus two component types). Editor ramp-up is the larger item: modal-vs-inline modes and AI-generated drafts change the editing workflow, so a short guide plus a "AI draft, human approves" convention is needed. Recommendation: adopt the field/entry components now for UX value, treat AI translation as an opt-in pilot until the package reaches 1.0 and the review-gate question is answered.
How can I help you explore Laravel packages today?