ink/ink-translatable
Ink Translatable is a Laravel package for adding multilingual fields to Eloquent models. Store and retrieve translations per locale with a simple, fluent API, fallback support, and easy integration into existing models—ideal for multilingual apps without duplicating database columns.
ink-translatable embodies the "side table" translation pattern: one row per (model, locale, attribute) rather than a column-per-locale or a single JSON blob. Use it as a concrete reference when writing the ADR for how translated content is stored. That decision is expensive to reverse once content exists, so it's worth pinning down early.Consider it only if:
Look elsewhere if:
spatie/laravel-translatable (JSON columns) or astrotomic/laravel-translatable (side table) — both actively maintained, tested, and widely deployed. The side-table/JSON choice should drive the pick, not this package.For executives: We evaluated a community package for translating content in the Laravel app. It's a Laravel 4-era library with no adoption — zero dependent projects, no maintainer activity — which means we would be the only ones maintaining it. The underlying idea (store translations as data so adding a market doesn't require a database change) is the right one and is what other, actively maintained packages do. Recommendation: adopt the pattern, not the package. The capability is roughly 1–3 engineer-days to implement in-house or a one-line swap to a maintained alternative, both of which are cheaper than carrying an abandoned dependency through a security review and a future framework upgrade.
For engineering: Treat ink/ink-translatable as documentation, not a dependency. It shows a workable translatable-trait + translations-table shape, but it targets Laravel 4 and carries no test suite signal, no PHP 7/8 support, and no upgrade path. If we want the side-table model, use astrotomic/laravel-translatable; if we want JSON columns for simpler content, use spatie/laravel-translatable; if we want neither, write the ~50-line trait ourselves so we own the locale-resolution and fallback semantics. Whichever way we go, decide the fallback rule (fallback vs. hide vs. flag) before we seed real content, and define the migration path off any per-locale columns we already have.
Bottom line: High pattern value, zero adoption value. Score this as research input to an architecture decision, not as a candidate dependency.
How can I help you explore Laravel packages today?