"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > ऑटोलोडेड अनुवादों के साथ लारवेल में एक बहुरूपी अनुवाद योग्य मॉडल का निर्माण

ऑटोलोडेड अनुवादों के साथ लारवेल में एक बहुरूपी अनुवाद योग्य मॉडल का निर्माण

2024-08-18 को प्रकाशित
ब्राउज़ करें:936

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

अनुवादित सामग्री को दृश्यों में प्रदर्शित करना

अपने ब्लेड व्यू में, आप किसी अन्य मॉडल विशेषता की तरह अनुवादित सामग्री प्रदर्शित कर सकते हैं:

{{ $post->title }}

{{ $post->content }}

निष्कर्ष

अनुवादों को संग्रहीत करने और फ़ॉलबैक तंत्र को लागू करने के लिए JSON कॉलम का उपयोग करके, आप अपने लारवेल एप्लिकेशन में बहुभाषी सामग्री के प्रबंधन को सुव्यवस्थित करते हैं। यह दृष्टिकोण अनुवादों को एक कॉलम में समेकित करता है, डेटा प्रबंधन को सरल बनाता है और आपके कोडबेस को अधिक रखरखाव योग्य बनाता है। चाहे आप एक ब्लॉग, ई-कॉमर्स साइट, या कोई बहुभाषी एप्लिकेशन बना रहे हों, यह विधि एक सहज और कुशल उपयोगकर्ता अनुभव सुनिश्चित करती है।

आनंद लेना!

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/rafaelogic/building-a-polymorfic-translatable-model-in-laravel-with-autoloaded-translations-3d99?1 यदि कोई उल्लंघन है, तो कृपया स्टडी_गोलंग@163 से संपर्क करें इसे हटाने के लिए .com
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3