多言語コンテンツを処理する場合、多くの場合、属性ごとに個別の行ではなく、JSON 列に翻訳を保存する方が効率的です。このアプローチでは、翻訳が 1 つの列に統合され、データの管理と取得が簡素化されます。
翻訳モデルとテーブルを拡張して、翻訳を保存するために JSON 列を使用できるようにします。これには、テーブル スキーマの更新と、JSON データを処理するための Translateable 特性の変更が含まれます。
ステップ 1: 移行テーブルの作成
変換テーブルがまだ存在しない場合は、新しい移行を作成します:
php artisan make:migration create_translations_table
ステップ 2: テーブル構造を定義する
database/migrations で生成された移行ファイルを開きます。新しいテーブルの場合は、次のように定義します:
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(); } }
複数のモデル間で翻訳処理を再利用できるようにするために、ユーザーが選択したロケールに基づいて翻訳されたコンテンツを自動的にロードする Translateable 特性を作成します。さらに、選択したロケールで利用可能な翻訳がない場合に、デフォルトのロケールからコンテンツをロードするフォールバック メカニズムを追加します。
ステップ 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: 翻訳可能な特性をモデルに適用する
翻訳サポートを必要とするモデルに Translateable 特性を追加します。
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 アプリケーションでの多言語コンテンツの管理を合理化します。このアプローチにより、翻訳が 1 つの列に統合され、データ処理が簡素化され、コードベースがより保守しやすくなります。ブログ、電子商取引サイト、またはその他の多言語アプリケーションを構築している場合でも、この方法によりスムーズで効率的なユーザー エクスペリエンスが保証されます。
楽しむ!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3