cloudmonitor / translatable
Translate model attributes into any number of languages.
Requires
- php: ^7.2.5|^8.0
- illuminate/support: ^8.0|^9.0|^10.0
README
Translate Eloquent attributes into multiple languages and use getLocale()
to seamlessly query the right translation.
Install
composer require cloudmonitor/translatable
Prepare Eloquent models
Similar to other special attributes in Eloquent, such as $fillables
, translatable attributes must be defined as an array. It is as simple as giving the name of the database column:
protected $translatable = [ 'name', ];
Translatable will now only be observing these attributes and skip the rest.
Using translations
As Translatable uses Laravels app()->getLocale()
it means it will figure out which language to use when you query name.
For instance, your locale is currently da
(Danish), so you want to update a book title. Simply do it as there was no translation implementation:
$book = Book::find($id); $book->name = 'New name for Danish version'; $book->save();
Or as an update method:
Book::find($id)->update(['name' => 'New name for Danish version']);
Similar when you want to get the name in the current locale you simply query it:
return Book::find($id)->name;
Other locales
Sometimes you want to update all translations or in a specific language or simply in a different than you are using. It could be a Danish moderator who wants to update the English title, titles for several languages, or something different.
Book::find($id)->setTranslation('name', 'en', 'Name in English');
Similarly, a specific language can be queried:
Book::find($id)->getTranslation('name', 'en');
Order By translated columns
Since the build-in ->orderBy()
won't work as the data is stored in JSON format, an optimized ->orderByTranslation()
has been added.
First parameter is column name, second will be direction and third locale. Only first column is required.
Book::orderByTranslation('name', 'asc', 'en');
Migrations
Behind the scenes Translatable uses JSON
columns in the database to store multiple versions in the same column:
$table->json('name');