«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Создание полиморфной переводимой модели в Laravel с автоматически загружаемыми переводами

Создание полиморфной переводимой модели в Laravel с автоматически загружаемыми переводами

Опубликовано 18 августа 2024 г.
Просматривать:609

Building a Polymorphic Translatable Model in Laravel with Autoloaded Translations

При работе с многоязычным контентом зачастую более эффективно хранить переводы в столбце JSON, а не в отдельных строках для каждого атрибута. Этот подход объединяет переводы в один столбец, упрощая управление и поиск данных.

Настройка системы перевода

Мы улучшим нашу модель и таблицу перевода, чтобы использовать столбец JSON для хранения переводов. Это потребует обновления схемы таблицы и изменения признака Translatable для обработки данных JSON.

Шаг 1. Создайте миграцию таблицы переводов

Если таблица переводов еще не существует, создайте новую миграцию:

php artisan make:migration create_translations_table

Шаг 2. Определите структуру таблицы

Откройте сгенерированный файл миграции в базе данных/миграции. Для новой таблицы определите ее следующим образом:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTranslationsTable extends Migration
{
    public function up()
    {
        Schema::create('translations', function (Blueprint $table) {
            $table->id();
            $table->string('locale'); // Stores the locale, e.g., 'en', 'fr'
            $table->string('translatable_type'); // Stores the related model type, e.g., 'Post', 'Product'
            $table->unsignedBigInteger('translatable_id'); // Stores the ID of the related model
            $table->json('translations'); // Stores all translations as a JSON object
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('translations');
    }
}

Шаг 3. Запустите миграцию
Примените миграцию к вашей базе данных:

php artisan migrate

Шаг 4. Создайте модель перевода

Далее создайте модель перевода для обработки полиморфных отношений:

php artisan make:model Translation

В модели перевода определите полиморфную связь:

class Translation extends Model
{
    protected $fillable = ['locale', 'translatable_type', 'translatable_id', 'translations'];

    protected $casts = [
        'translations' => 'array',
    ];

    public function translatable()
    {
        return $this->morphTo();
    }
}

Реализация признака Translatable с помощью хранилища JSON

Чтобы обеспечить возможность повторного использования обработки перевода в нескольких моделях, мы создадим признак Translatable, который будет автоматически загружать переведенный контент на основе выбранного пользователем языкового стандарта. Кроме того, мы добавим резервный механизм для загрузки контента из локали по умолчанию, если для выбранной локали недоступен перевод.

Шаг 1. Создайте переводимый признак с обработкой JSON

namespace App\Traits;

use App\Models\Translation;
use Illuminate\Support\Facades\App;

trait Translatable
{
    public static function bootTranslatable()
    {
        static::retrieved(function ($model) {
            $model->loadTranslations();
        });
    }

    public function translations()
    {
        return $this->morphMany(Translation::class, 'translatable');
    }

    public function loadTranslations()
    {
        $locale = App::getLocale();
        $defaultLocale = config('app.default_locale', 'en'); // Fallback to the default locale

        // Try to load translations for the current locale
        $translation = $this->translations()->where('locale', $locale)->first();

        if (!$translation && $locale !== $defaultLocale) {
            // If no translations are found for the current locale, fallback to the default locale
            $translation = $this->translations()->where('locale', $defaultLocale)->first();
        }

        if ($translation) {
            $translations = $translation->translations;
            foreach ($translations as $key => $value) {
                $this->{$key} = $value;
            }
        }
    }

    public function addTranslations(array $translations, $locale = null)
    {
        $locale = $locale ?? App::getLocale();
        return $this->translations()->updateOrCreate(
            ['locale' => $locale],
            ['translations' => $translations]
        );
    }
}

Шаг 2. Примените признак Translatable к вашей модели
Добавьте свойство Translatable к любой модели, требующей поддержки перевода.

namespace App\Models;

use App\Traits\Translatable;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use Translatable;

    protected $fillable = ['title', 'content'];
}

Пример: создание переведенной модели

Добавьте переводы как объект JSON:

$post = Post::create(['title' => 'Default Title', 'content' => 'Default Content']);

// Adding translations
$post->addTranslations([
    'title' => 'Hello World',
    'content' => 'Welcome to our website'
], 'en');

$post->addTranslations([
    'title' => 'Bonjour le monde',
    'content' => 'Bienvenue sur notre site Web'
], 'fr');

Получение переведенных моделей

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

App::setLocale('fr');
$post = Post::find(1);
echo $post->title; // Displays "Bonjour le monde" if French translation exists

App::setLocale('es');
$post = Post::find(1);
echo $post->title; // Displays "Hello World" as it falls back to the English translation

Отображение переведенного контента в представлениях

В представлениях Blade вы можете отображать переведенный контент как любой другой атрибут модели:

{{ $post->title }}

{{ $post->content }}

Заключение

Используя столбец JSON для хранения переводов и реализуя резервный механизм, вы оптимизируете управление многоязычным контентом в своем приложении Laravel. Этот подход объединяет переводы в один столбец, упрощая обработку данных и делая вашу кодовую базу более удобной в обслуживании. Независимо от того, создаете ли вы блог, сайт электронной коммерции или любое многоязычное приложение, этот метод обеспечивает удобство и эффективность работы пользователя.

Наслаждаться!

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/rafaelogic/building-a-polymorphic-translatable-model-in-laravel-with-autoloaded-translations-3d99?1 В случае каких-либо нарушений, пожалуйста, свяжитесь с Study_golang@163. .com, чтобы удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3