"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 자동 로드된 번역을 사용하여 Laravel에서 다형성 번역 가능 모델 구축

자동 로드된 번역을 사용하여 Laravel에서 다형성 번역 가능 모델 구축

2024-08-18에 게시됨
검색:225

Building a Polymorphic Translatable Model in Laravel with Autoloaded Translations

다국어 콘텐츠를 처리할 때 각 속성에 대한 개별 행보다 JSON 열에 번역을 저장하는 것이 더 효율적인 경우가 많습니다. 이 접근 방식은 번역을 단일 열로 통합하여 데이터 관리 및 검색을 단순화합니다.

번역 시스템 설정

번역 저장에 JSON 열을 사용하도록 번역 모델과 테이블을 향상하겠습니다. 여기에는 JSON 데이터를 처리하기 위해 테이블 ​​스키마를 업데이트하고 Translatable 특성을 수정하는 작업이 포함됩니다.

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 저장소로 번역 가능한 특성 구현

여러 모델에서 번역 처리를 재사용할 수 있도록 하기 위해 사용자가 선택한 로케일에 따라 번역된 콘텐츠를 자동으로 로드하는 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 특성을 추가하세요.

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

뷰에 번역된 콘텐츠 표시

블레이드 보기에서는 다른 모델 속성과 마찬가지로 번역된 콘텐츠를 표시할 수 있습니다.

{{ $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