organi/translatables
Organi Translatables brings multilingual attribute support to Laravel Eloquent models. Attach a simple trait to store and retrieve translated values per locale, with locale fallbacks and straightforward setup for building multi-language applications.
HasTranslations trait (a day of work, fully owned) or take a dependency. This package sits in the "write it ourselves" weight class, so it's a useful reference point even if we don't adopt it.translations table with an indexed locale. This is the decision with the longest tail: JSON is faster to ship and simpler in the admin UI, but it complicates filtering, sorting, full-text search, partial-translation reporting, and per-locale export. Whichever approach this package takes locks in that tradeoff.lang/ files). Conflating these is a common and expensive scoping error.Consider it when:
Look elsewhere when:
locale column — or a real search index.lang/ layer plus intl, not this.Practical recommendation: treat this as an evaluation spike, not an adoption. Timebox it: read the source, confirm the storage model, confirm fallback semantics, and benchmark a query-by-translation case. Run the spike in parallel with a two-hour "write the trait ourselves" estimate. If we can't articulate a specific advantage over the well-adopted alternatives in the Laravel ecosystem after that spike, we should not take the dependency.
For executives: This is a small Laravel add-on that lets us store product and content fields in multiple languages without redesigning the database each time we enter a new market. Integration cost is low — days, not weeks — and it directly de-risks international expansion by making locale a data concern rather than a re-architecture. The caveat is maturity: the package has effectively no external user base, so it carries abandonment and maintenance risk that a widely-adopted alternative does not.
For engineering: It's a trait-based translatable-attributes package for Eloquent models. Assess it on two axes — the storage model it imposes (JSON column vs. translations table) and whether we're comfortable owning it. Given zero dependents and no community surface, the realistic paths are (a) audit and fork with an internal owner, or (b) treat it as a design reference and implement the trait in-house. Either way, the decision should be made on the storage model, since that's what's expensive to change later; the trait itself is cheap either way.
Ask: Approve a timeboxed spike to confirm the storage model and fallback behavior, with a decision gate comparing it against a self-built trait. Do not approve it as a production dependency on the basis of the package's own documentation alone.
How can I help you explore Laravel packages today?