mountainclans/livewire-translatable

This is my package livewire-translatable

1.1.0 2025-07-08 13:15 UTC

This package is auto-updated.

Last update: 2025-07-08 13:15:48 UTC


README

UI компонент для интуитивной работы с переводимыми полями. Опирается на функциональность, предоставляемую пакетом Spatie Translatable.

Установка

Установите пакет при помощи Composer:

composer require mountainclans/livewire-translatable

Обратите внимание, что для корректной стилизации в вашем проекте должен использоваться TailwindCSS.

Добавьте в tailwind.config.js в секцию content:

'./vendor/mountainclans/livewire-translatable/resources/views/**/*.blade.php'

Опубликуйте файл конфигурации и задайте в нём нужные языки, на которые переводится ваш сайт:

php artisan vendor:publish --tag="livewire-translatable-config"

Опционально, вы можете опубликовать views для их переопределения:

php artisan vendor:publish --tag="livewire-translatable-views"

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

Оберните translatable-поля компонентом <x-ui.translatable>:

<x-ui.translatable>
    
    Переводимые поля, к примеру
    
    <x-ui.input wire:model="title" 
                translatable
                placeholder="{{ __('Enter the page title') }}"
                label="{{ __('Page title *') }}"
    />
    
</x-ui.translatable>

Каждому из переводимых полей необходимо добавить атрибут translatable.

Используйте <x-ui.input> из пакета UI и <x-ui.tiptap>.

ContentLanguages

Пакет предоставляет сервис-класс ContentLanguages, имеющий два статических метода:

  • ContentLanguages::all() - позволяет получить массив всех языков, на которые переводится приложение в формате ключ => название языка.
  • ContentLanguages::default() - возвращает ключ первого языка, заданного в конфигурации.

Трейты

Трейт FilledTranslatableFields

Трейт позволяет задать пустые стартовые значения для всех языков, на которые переводится сайт, для только что инициализированного поля. Полезен при использовании с редактором, который требует строку при инициализации значения.

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

# Your livewire component
//...
use MountainClans\LivewireTranslatable\Traits\FilledTranslatableFields;

public function mount(?string $blogId = null): void
    {
        if ($this->blogId) {
            $this->blog = Blog::findOrFail($this->blogId);

            $this->content = $this->blog->getAllTranslations('content');
            //...
        }
    }

Поле модели (в данном случае, content) обязательно должно быть указано в списке $translatable атрибутов модели.

Трейт RequireTranslations

Предоставляет Livewire-компоненту метод requireTranslations, позволяющий убедиться при валидации поля, что у него есть переводы полей.

# Your livewire component

public function saveSomething(): void
{
    $this->validate([
            'categoryId' => [
                'nullable',
                'exists:blog_categories,id',
            ],
            ...$this->requireTranslations('title', true, true, 10, 255),
    ]);
}

Метод принимает следующие параметры:

  • string $fieldName - поле компонента, которое валидируем;
  • bool $isOptional - можно ли оставить его пустым;
  • bool $requireDefaultLanguage - требовать ли заполнения хотя бы ключа по умолчанию (получаемого из ContentLanguages::default());
  • int $minLength - минимальная длина поля;
  • int $maxLength - максимальная длина поля.

Трейт LogTranslatableAttributes

Позволяет корректно логировать изменения в переводимых полях модели с использованием пакета Spatie Activitylog.

class YourModel extends Model {
    use LogsActivity; // обязательно подключите трейт от Spatie
    use LogTranslatableAttributes;
    
    public array $translatable = [
        // ... 
    ];
}

Использование трейта опционально. Данный пакет не требует использования пакета Spatie Activitylog.

Изменения

Получите больше информации об изменениях в пакете, прочитав CHANGELOG.

Авторы

Лицензия

The MIT License (MIT). Please see License File for more information.