Laravel

Lingo.dev CLIによるLaravelのAI翻訳

Laravelとは?

Laravelは、表現力豊かでエレガントな構文を持つPHPウェブアプリケーションフレームワークです。ルーティング、認証、セッション、キャッシュなどの組み込み機能を提供し、最新のウェブアプリケーションを構築できます。

Lingo.dev CLIとは?

Lingo.devはAI駆動の翻訳プラットフォームです。Lingo.dev CLIはソースファイルを読み取り、翻訳可能なコンテンツを大規模言語モデルに送信し、翻訳されたファイルをプロジェクトに書き戻します。

このガイドについて

このガイドでは、LaravelアプリケーションでLingo.dev CLIをセットアップする方法を説明します。ローカライゼーションをサポートするLaravelプロジェクトの作成方法、翻訳パイプラインの設定方法、言語切り替えの実装方法を学びます。

ステップ1. Laravelプロジェクトのセットアップ

  1. PHPとComposerをインストールします:

    /bin/bash -c "$(curl -fsSL https://php.new/install/mac/8.4)"
    
  2. Laravelをグローバルにインストールします:

    composer global require laravel/installer
    
  3. 新しいLaravelプロジェクトを作成します:

    laravel new example-app
    

    プロンプトが表示されたら:

    • プロジェクトタイプで「None」を選択
    • データベースで「SQLite」を選択
  4. プロジェクトディレクトリに移動します:

    cd example-app
    

ステップ2. ソースコンテンツの作成

  1. Laravelのデフォルト言語ファイルを公開します:

    php artisan lang:publish
    

    これにより、lang/en/auth.phpのような翻訳ファイルを含むlang/enディレクトリが作成されます。

ステップ3. CLIの設定

プロジェクトのルートにi18n.jsonファイルを作成します:

{
  "$schema": "https://lingo.dev/schema/i18n.json",
  "version": 1.8,
  "locale": {
    "source": "en",
    "targets": ["es"]
  },
  "buckets": {
    "php": {
      "include": ["lang/[locale]/*.php"]
    }
  }
}

このファイルは以下を定義します:

  • Lingo.dev CLIが翻訳すべきファイル
  • 翻訳する言語間

この場合、設定は英語からスペイン語へのPHP言語ファイルの翻訳を行います。

重要な点として:

  • [locale]は実行時に置き換えられるプレースホルダーです。これにより、コンテンツが一つの場所(例:lang/en/auth.php)から読み取られ、別の場所(例:lang/es/auth.php)に書き込まれることを保証します。
  • Lingo.dev CLIは、このパターンに一致する言語ディレクトリ内のすべてのPHPファイルを翻訳します。

詳細については、i18n.json設定を参照してください。

ステップ 4. コンテンツを翻訳する

  1. Lingo.devアカウントにサインアップする

  2. CLIを通じてLingo.devにログインします:

    npx lingo.dev@latest login
    
  3. 翻訳パイプラインを実行します:

    npx lingo.dev@latest run
    

    CLIは翻訳されたコンテンツを保存するためのlang/es/ディレクトリと、翻訳済みの内容を追跡するためのi18n.lockファイル(不要な再翻訳を防ぐため)を作成します。

ステップ 5. 翻訳を使用する

  1. ルートからロケールを設定するミドルウェアを作成します:

    php artisan make:middleware SetLocaleFromRoute
    
  2. 生成されたapp/Http/Middleware/SetLocaleFromRoute.phpファイルを更新します:

    <?php
    namespace App\Http\Middleware;
    
    use Closure;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\App;
    use Symfony\Component\HttpFoundation\Response;
    
    class SetLocaleFromRoute
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
         */
        public function handle(Request $request, Closure $next): Response
        {
            // 'locale' comes from the {locale} route parameter
            if ($locale = $request->route('locale')) {
                App::setLocale($locale); // sets the locale for this request
            }
    
            return $next($request);
        }
    }
    
  3. bootstrap/app.phpにミドルウェアを登録します:

    <?php
    
    use Illuminate\Foundation\Application;
    use Illuminate\Foundation\Configuration\Exceptions;
    use Illuminate\Foundation\Configuration\Middleware;
    use App\Http\Middleware\SetLocaleFromRoute;
    
    return Application::configure(basePath: dirname(__DIR__))
        ->withRouting(
            web: __DIR__.'/../routes/web.php',
            commands: __DIR__.'/../routes/console.php',
            health: '/up',
        )
        ->withMiddleware(function (Middleware $middleware) {
            $middleware->alias([
                'setLocale' => SetLocaleFromRoute::class,
            ]);
        })
        ->withExceptions(function (Exceptions $exceptions): void {
            //
        })->create();
    
  4. routes/web.phpでロケールプレフィックス付きのルートを設定します:

    <?php
    
    use Illuminate\Support\Facades\Route;
    
    Route::redirect('/', '/en'); // default to English
    
    Route::prefix('{locale}')
        ->whereIn('locale', ['en', 'es'])
        ->middleware('setLocale')
        ->group(function () {
            Route::get('/', function () {
                return view('welcome');
            })->name('home');
        });
    
  5. ビューでローカライズされたコンテンツを表示するために__ヘルパー関数を使用します:

    <!DOCTYPE html>
    <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
        <head>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1">
            <title>{{ config('app.name', 'Laravel') }}</title>
        </head>
        <body>
            <nav>
              <a href="{{ route('home', ['locale' => 'en']) }}" class="underline mr-4">English</a>
              <a href="{{ route('home', ['locale' => 'es']) }}" class="underline">Español</a>
            </nav>
    
            <p class="mb-6">{{ __('auth.throttle') }}</p>
        </body>
    </html>
    
  6. 開発サーバーを起動します:

    npm install
    npm run build
    composer run dev
    
  7. 以下のURLにアクセスします: