На мой взгляд использование пакетов для этой цели нецелесообразно.
Обычная полиморфическая связь подойдет.
И так, давайте представим что основной контент статьи на русском языке.
Во первых, создадим модель нашей локализации:
php artisan make:model Localization
Укажем что это полиморфическая связь:
protected $table = 'localization';
public function lozalizable()
{
return $this->morphTo();
}
В нашей модели статей привяжем свежесозданную модель в качестве связи:
public function lozalization(){
return $this->morphOne('App\Localization', 'lozalizable');
}
И создадим миграцию для модели Lozalizable:
Schema::create('localization', function (Blueprint $table) {
$table->increments('id');
$table->string('field');
$table->string('language');
$table->string('value');
$table->string('lozalizable_type');
$table->integer('lozalizable_id');
$table->timestamps();
});
Теперь, для создания локализации статьи с языком en выполним следующий код:
$article = Article::create($Atricle);
$localization = new Localization;
$localization->language = 'en';
$localization->field = 'content';
$localization->value = 'Znachenye na english yazike';
$article->localization()->save($localization); //привязываем к свежесозданному объекту Article новую локализацию
С помощью scope функций в модели можно без особых проблем реализовать более удобное выдергивание нужного значения и языка:
public function scopeGetLocalize($language, $field){
return $this->localization()->where(['language' => $language, 'field' => $field])-> firstOrFail()->value;
}
В таком случае, скажем, поле title для локализации en можно выдергивать так:
$article->getLocalize('en', 'title')