다국어 콘텐츠를 처리할 때 각 속성에 대한 개별 행보다 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(); } }
여러 모델에서 번역 처리를 재사용할 수 있도록 하기 위해 사용자가 선택한 로케일에 따라 번역된 콘텐츠를 자동으로 로드하는 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 애플리케이션에서 다국어 콘텐츠 관리가 간소화됩니다. 이 접근 방식은 번역을 단일 열로 통합하여 데이터 처리를 단순화하고 코드베이스를 보다 쉽게 유지 관리할 수 있도록 합니다. 블로그, 전자 상거래 사이트 또는 다국어 애플리케이션을 구축하는 경우 이 방법을 사용하면 원활하고 효율적인 사용자 경험을 보장할 수 있습니다.
즐기다!
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3