PHPackages                             stolkom/translatable - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. stolkom/translatable

ActiveLibrary[Database &amp; ORM](/categories/database)

stolkom/translatable
====================

Laravel package for model translations

1.0(4y ago)141[1 PRs](https://github.com/stolkom/translatable/pulls)MITPHPPHP ^7.2

Since Jun 20Pushed 2y ago1 watchersCompare

[ Source](https://github.com/stolkom/translatable)[ Packagist](https://packagist.org/packages/stolkom/translatable)[ RSS](/packages/stolkom-translatable/feed)WikiDiscussions master Synced 6d ago

READMEChangelog (1)Dependencies (1)Versions (2)Used By (0)

Пакет **Translatable** предназначен для внедрения перевода полей модели. По сути, **Translatable** не является заменой lang-файлов, а служит для перевода значений, хранящихся в БД.

Установка
---------

[](#установка)

Установить пакет можно с помощью composer-а:

```
composer require stolkom/translatable

```

Если планируется использовать общую таблицу для хранения переводов, необходимо её создать. Для этого необходимо выполнить следующие команды:

```
php artisan vendor:publish --provider="Stolkom\Translatable\TranslatableServiceProvider"
php artisan migrate

```

Использование
-------------

[](#использование)

Подключить Trait можно, добавив следующую строку в тело модели:

```
use Stolkom\Translatable\Translatable;
```

Список переводимых полей указывается в массиве translatableAttributes, который нужно объявить в теле модели:

```
public $translatableAttributes = ['name', 'description'];
```

Для всех моделей, использующих **Translatable** трейт, по умолчанию включен автоперевод. Таким образом, все поля, указанные в массиве **translatableAttributes**, переводятся на язык текущей локали пользователя автоматически при обращении к ним. Если перевод для значения поля на выбранный язык отсутствует в таблице переводов, возвращается непереведенное значение.

```
$exampleModel->name // будет переведено, если значение перевода есть в БД
```

### Получение перевода на конкретный язык

[](#получение-перевода-на-конкретный-язык)

Если необходимо получить перевод значения поля не на текущий язык пользователя, а на какой-то другой, можно воспользоваться функцией:

```
public function getTranslation(string $field, string $locale = null)
```

`getTranslation` возвращает перевод выбранного поля на выбранный язык. Если перевода нет в таблице БД, возвращает непереведенное значение поля.

- **field** - тип string. Наименование поля модели, значение которого нужно перевести.
- **locale** - тип string. Двухбуквенное обозначение локали, перевод на язык которой нужно получить. Если не задана, используется текущая локаль пользователя.

*Возвращает: string*

### Отключение автоматического перевода

[](#отключение-автоматического-перевода)

Если в какой-то момент необходимо отключить автоперевод полей (например на страницах create/edit), нужно вызвать метод модели `disableAutoTranslations`:

```
$exampleModel->disableAutoTranslations();
```

Чтобы включить автоперевод обратно, нужно вызвать метод `enableAutoTranslations`.

### Общая таблица переводов

[](#общая-таблица-переводов)

По умолчанию для хранения переводов полей модели используется общая таблица **translations** с полиморфными связями.

### Отдельная таблица переводов

[](#отдельная-таблица-переводов)

Если для модели предполагается большое количество записей, то в целях предотвращения чрезмерного разрастания общей таблицы и снижения нагрузки на БД можно использовать отдельную таблицу переводов для этой модели.

Для этого нужно создать миграцию со следующими полями:

```
Schema::create('example_model_translations', function (Blueprint $table) {
   $table->increments('id');
   $table->unsignedInteger('example_model_id')->index();
   $table->string('field');
   $table->string('locale', 2);
   $table->text('text')->nullable();

   $table->index(['example_model_id', 'field', 'locale']);
});
```

Где `example_model_translations` - имя таблицы переводов.

Чтобы указать, что модель использует отдельную таблицу, в тело модели необходимо добавить переменную `translationTable`, содержащую название используемой таблицы:

```
public $translationsTable = 'example_model_translations';
```

Кроме того, необходимо создать отдельную модель для переводов:

```
class ExampleModelTranslation extends Model
{
   public $timestamps = false;
   protected $guarded = [];
}
```

и переопределить метод `getTranslationModelName` в модели, использующей Translatable трейт, так, чтобы он возвращал имя созданной модели переводов:

```
protected static function getTranslationModelName()
{
   return ExampleModelTranslation::class;
}
```

После этого **Translatable** трейт автоматически будет использовать созданную таблицу для хранения переводов этой модели (в нашем случае ExampleModel).

### Сохранение переводов

[](#сохранение-переводов)

Для сохранения переводов модели можно воспользоваться методом:

```
public function saveTranslations(array $translations)
```

Метод `saveTranslations` принимает в качестве атрибута массив следующего вида:

```
['field_name' => ['locale' => 'value']]
```

*Пример:*

```
$exampleModel->saveTranslations([
   'name' => [
      'en' => 'Example',
      'ru' => 'Пример'
   ],
   'description' => [
      'en' => 'Description example',
      'ru' => 'Пример описания'
   ],
]);
```

### Нетерпеливая загрузка (Eager loading)

[](#нетерпеливая-загрузка-eager-loading)

Стоит учитывать, что по умолчанию Laravel использует ленивую загрузку (Lazy loading) и вывод списка из 100 записей с переводами создаст 101 запрос. Для решения этой проблемы следует использовать нетерпеливую загрузку.

```
ModelName::with('translations')->get();
```

Кроме того, можно автоматически применять нетерпеливую загрузку для модели. Для этого достаточно добавить в тело модели следующую строку:

```
protected $with = ['translations'];
```

###  Health Score

22

—

LowBetter than 22% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity6

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity46

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

1792d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/5691293b76418218ff1b36ecad492d14398a224da6d9b686118b20d15db5026e?d=identicon)[stolkom](/maintainers/stolkom)

---

Top Contributors

[![stolkom](https://avatars.githubusercontent.com/u/86167115?v=4)](https://github.com/stolkom "stolkom (7 commits)")

### Embed Badge

![Health badge](/badges/stolkom-translatable/health.svg)

```
[![Health](https://phpackages.com/badges/stolkom-translatable/health.svg)](https://phpackages.com/packages/stolkom-translatable)
```

###  Alternatives

[anourvalar/eloquent-serialize

Laravel Query Builder (Eloquent) serialization

11320.2M21](/packages/anourvalar-eloquent-serialize)[overtrue/laravel-versionable

Make Laravel model versionable.

585308.0k5](/packages/overtrue-laravel-versionable)[abbasudo/laravel-purity

elegant way to add filter and sort in laravel

514330.5k1](/packages/abbasudo-laravel-purity)[statamic-rad-pack/runway

Eloquently manage your database models in Statamic.

135192.6k5](/packages/statamic-rad-pack-runway)[dragon-code/laravel-deploy-operations

Performing any actions during the deployment process

240173.5k2](/packages/dragon-code-laravel-deploy-operations)[stayallive/laravel-eloquent-observable

Register Eloquent model event listeners just-in-time directly from the model.

2928.9k7](/packages/stayallive-laravel-eloquent-observable)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
