This package contains a trait to make Eloquent models translatable. Translations are stored in Database. All translation will be cached by default Laravel Cache.
This Library forked from spatie/laravel-translatable
Technically, all methods are same. Use database as storage only.
Once the trait is installed on the model you can do these things:
$newsItem = new NewsItem; // This is an Eloquent model
$newsItem
->setTranslation('name', 'en', 'Name in English')
->setTranslation('name', 'nl', 'Naam in het Nederlands')
->save();
$newsItem->name; // Returns 'Name in English' given that the current app locale is 'en'
$newsItem->getTranslation('name', 'nl'); // returns 'Naam in het Nederlands'
app()->setLocale('nl');
$newsItem->name; // Returns 'Naam in het Nederlands'
You can install the package via composer:
composer require solutionforest/laravel-translatable
The required steps to make a model translatable are:
- First,
php artisian migrate
migrate the table - Next, you need to add the
SolutionForest\Translatable\HasTranslations
-trait. - Next, you should create a public property
$translatable
which holds an array with all the names of attributes you wish to make translatable.
Here's an example of a prepared model:
use Illuminate\Database\Eloquent\Model;
use SolutionForest\Translatable\HasTranslations;
class NewsItem extends Model
{
use HasTranslations;
public $translatable = ['name'];
}
The easiest way to get a translation for the current locale is to just get the property for the translated attribute.
For example (given that name
is a translatable attribute):
$newsItem->name;
You can also use this method:
public function getTranslation(string $attributeName, string $locale) : string
This function has an alias named translate
.
You can get all translations by calling getTranslations()
without an argument:
$newsItem->getTranslations();
Or you can use the accessor
$yourModel->translations
The easiest way to set a translation for the current locale is to just set the property for a translatable attribute.
For example (given that name
is a translatable attribute):
$newsItem->name = 'New translation';
To set a translation for a specific locale you can use this method:
public function setTranslation(string $attributeName, string $locale, string $value)
To actually save the translation, don't forget to save your model.
$newsItem->setTranslation('name', 'en', 'Updated name in English');
$newsItem->save();
- if you want to validate an attribute for uniqueness before saving/updating the db, you might want to have a look at laravel-unique-translation which is made specifically for laravel-translatable.
You can forget a translation for a specific field:
public function forgetTranslation(string $attributeName, string $locale)
You can forget all translations for a specific locale:
public function forgetAllTranslations(string $locale)
public function getTranslations(string $attributeName): array
public function setTranslations(string $attributeName, array $translations)
Here's an example:
$translations = [
'en' => 'Name in English',
'nl' => 'Naam in het Nederlands'
];
$newsItem->setTranslations('name', $translations);
Right after calling setTranslation
the SolutionForest\Translatable\Events\TranslationHasBeenSet
-event will be fired.
It has these properties:
/** @var \Illuminate\Database\Eloquent\Model */
public $model;
/** @var string */
public $attributeName;
/** @var string */
public $locale;
public $oldValue;
public $newValue;
You can immediately set translations when creating a model. Here's an example:
NewsItem::create([
'name' => [
'en' => 'Name in English',
'nl' => 'Naam in het Nederlands'
],
]);
Please see CHANGELOG for more information what has changed recently.
composer test
Please see CONTRIBUTING for details.
If you discover any security related issues, please email [email protected] instead of using the issue tracker.
We got the idea to store translations as json in a column from Mohamed Said. Parts of the readme of his multilingual package were used in this readme.
SolutionForest is a solution house based in Hong Kong.on our website.
The MIT License (MIT). Please see License File for more information.