自動ロードされた翻訳を使用して Laravel でポリモーフィックな翻訳可能モデルを構築する

WBOY
リリース: 2024-08-11 18:35:32
オリジナル
623 人が閲覧しました

Building a Polymorphic Translatable Model in Laravel with Autoloaded Translations

多言語コンテンツを処理する場合、多くの場合、属性ごとに個別の行を保存するよりも、翻訳を JSON 列に保存する方が効率的です。このアプローチでは、翻訳が 1 つの列に統合され、データの管理と取得が簡素化されます。

翻訳システムのセットアップ

翻訳モデルとテーブルを拡張して、翻訳を保存するために JSON 列を使用できるようにします。これには、テーブル スキーマの更新と、JSON データを処理するための Translatable 特性の変更が含まれます。

ステップ 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();
    }
}
ログイン後にコピー

JSON ストレージを使用した翻訳可能な特性の実装

複数のモデル間で翻訳処理を再利用できるようにするために、ユーザーが選択したロケールに基づいて翻訳されたコンテンツを自動的にロードする 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: 翻訳可能な特性をモデルに適用する
翻訳サポートを必要とするモデルに、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
ログイン後にコピー

翻訳されたコンテンツをビューに表示する

Blade ビューでは、他のモデル属性と同様に、翻訳されたコンテンツを表示できます。

<h1>{{ $post->title }}</h1>
<p>{{ $post->content }}</p>
ログイン後にコピー

結論

JSON 列を使用して翻訳を保存し、フォールバック メカニズムを実装することで、Laravel アプリケーションでの多言語コンテンツの管理を合理化します。このアプローチにより、翻訳が 1 つの列に統合され、データ処理が簡素化され、コードベースがより保守しやすくなります。ブログ、電子商取引サイト、またはその他の多言語アプリケーションを構築している場合でも、この方法によりスムーズで効率的なユーザー エクスペリエンスが保証されます。

お楽しみください!

以上が自動ロードされた翻訳を使用して Laravel でポリモーフィックな翻訳可能モデルを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!