"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > بناء نموذج متعدد الأشكال قابل للترجمة في Laravel مع الترجمات المحملة تلقائيًا

بناء نموذج متعدد الأشكال قابل للترجمة في Laravel مع الترجمات المحملة تلقائيًا

تم النشر بتاريخ 2024-08-18
تصفح:364

Building a Polymorphic Translatable Model in Laravel with Autoloaded Translations

عند التعامل مع محتوى متعدد اللغات، غالبًا ما يكون تخزين الترجمات في عمود JSON أكثر فاعلية بدلاً من الصفوف الفردية لكل سمة. يقوم هذا الأسلوب بدمج الترجمات في عمود واحد، مما يبسط إدارة البيانات واسترجاعها.

إعداد نظام الترجمة

سنقوم بتحسين نموذج الترجمة وجدولنا لاستخدام عمود JSON لتخزين الترجمات. سيتضمن ذلك تحديث مخطط الجدول وتعديل السمة القابلة للترجمة للتعامل مع بيانات 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();
    }
}

تنفيذ السمة القابلة للترجمة باستخدام تخزين JSON

لجعل معالجة الترجمة قابلة لإعادة الاستخدام عبر نماذج متعددة، سنقوم بإنشاء سمة قابلة للترجمة والتي ستقوم تلقائيًا بتحميل المحتوى المترجم بناءً على اللغة المحددة للمستخدم. بالإضافة إلى ذلك، سنضيف آلية احتياطية لتحميل المحتوى من اللغة الافتراضية في حالة عدم توفر ترجمة للغة المحددة.

الخطوة 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: تطبيق السمة القابلة للترجمة على النموذج الخاص بك
أضف السمة القابلة للترجمة إلى أي نموذج يتطلب دعم الترجمة.

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');

استرجاع النماذج المترجمة

عند استرداد نموذج النشر، سيتم تلقائيًا تحميل المحتوى المترجم بناءً على اللغة الحالية أو الرجوع إلى اللغة الافتراضية إذا لزم الأمر:

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