langsys/langsys-php をベースにした軽量な Laravel バインディングです。@t Blade ディレクティブ、t() ヘルパー、ロケール用ミドルウェアを提供します。コード内のフレーズが、そのまま検索キーと基準言語のデフォルトテキストを兼ねるため、キーファイルも抽出ステップも不要です。翻訳はサーバー側で行われるので、ページは最初からローカライズされた状態で届きます。

バックエンド SDK のため、このページにブラウザ内プレイグラウンドはありません。ブラウザでは PHP を実行できないためです。以下のすべての例はデモアプリで実際に試せます。クローンして php artisan serve を実行するか、Codespace で開くと、インストールから起動まで行う本物の PHP コンテナが使えます。自動ページ翻訳や Inertia のシーディングを含むパッケージの完全なリファレンスは、Laravel SDK ドキュメントをご覧ください。

AI コーディングエージェントを使っていますか?次のプロンプトを渡してください
Add Langsys translation to this Laravel app.

1. Read https://docs.langsys.dev/llms.txt, then follow
   https://docs.langsys.dev/learn/sdk/laravel/ for the install and setup.
2. The English text in the code is the translation key. Wrap user-facing
   strings as they are: no keys file, no extraction step, and no
   hand-written plural or gender branches (Langsys generates those).
3. Read the Langsys project id and API key from environment variables.
   The write key is for development and servers only; anything shipped
   to the browser gets the read-only key.
4. Keep brand names and user-generated content out of translation.

インストール

composer require langsys/langsys-php-laravel
php artisan vendor:publish --tag=langsys-config
.env
# The server can hold a WRITE key — unlike a browser app, it's never
# shipped to visitors. A write key is what lets new phrases register.
LANGSYS_API_KEY=your-api-key
LANGSYS_PROJECT_ID=your-project-id

プロジェクトやキーをまだお持ちでない場合は、クイックスタートで 2 分ほどで両方とも用意できます。

ミドルウェア

2 つのミドルウェアがフレームワーク側の処理を担当します。DetectLocale は訪問者のロケールを(クエリパラメータ、Cookie、セッション、Accept-Language の順に)判定し、その選択を保持します。FlushPendingRegistrations は、新しく検出されたフレーズをレスポンスの送信後に Langsys へ送るため、登録処理でページが遅くなることはありません。

ソースを表示 ↗
// bootstrap/app.php (Laravel 11/12)
->withMiddleware(function (Middleware $middleware) {
    $middleware->web(append: [
        // Resolves ?locale= / cookie / session / Accept-Language,
        // then persists the visitor's choice.
        \Langsys\Laravel\Http\Middleware\DetectLocale::class,
        // After the response is sent, registers any phrases
        // rendered for the first time.
        \Langsys\Laravel\Http\Middleware\FlushPendingRegistrations::class,
    ]);
})

Blade で翻訳する

ディレクティブは 1 つだけです:@t(phrase, category?, params?, locale?)。パラメーターは {name} マーカーで埋め込みます。数値と日付はロケールに合わせて書式化され、出力は HTML エスケープされます。

@t — パラメーターを含むインライン文字列 ソースを表示 ↗
<h1>@t('Welcome to our store', 'Home')</h1>
<p>@t('Hello, {name}! You have {count} new messages.', 'Greetings',
    ['name' => $name, 'count' => $count])</p>

PHP のどこからでも

@t は、エスケープ処理を加えた t() ヘルパーにすぎません。ヘルパー自体は、コントローラー、Livewire コンポーネント、ジョブ、メール、検証メッセージなど、どこでも使えます。

t() — 同じ継ぎ目で、Bladeは不要 ソースを表示 ↗
// Controllers, Livewire components, jobs, mail — anywhere:
$title = t('Order confirmed', 'Checkout');
$body  = t('Your order {id} ships on {date}.', 'Checkout', [
    'id'   => (string) $order->number, // strings skip number formatting
    'date' => $order->ships_at,        // DateTime → locale-formatted
]);

複数形

視聴 · 1:14 複数形の処理

文は複数形の分岐を作らず、そのまま書いてください。Langsys が翻訳時に各ロケールの複数形を生成し(基準ロケールも含みます)、SDK が数に合ったブランチを表示します(ext-intl による完全な ICU 対応)。どの SDK でも同じなので、バックエンドとフロントエンドの間でフレーズをそのまま共有できます。

ソースを表示 ↗
// Written flat. Langsys generates each locale's plural forms during
// translation (the base locale included) and the SDK picks the branch.
t('You have {count} items in your cart', 'Cart', ['count' => $count]);

Langsys が生成する複数形は、langsys/langsys-php 1.3.2 以降で PHP に反映されます。それより前のバージョンでは、1 を含むすべての数に対して複数形が表示されます。

性の一致

スペイン語、フランス語、ロシア語では、対象となる人物に合わせて {username} has been invited が語形変化します。Langsys は、複数形と同じように、翻訳時にこれらの分岐を生成します。引数の名前は変数名に _gender を付けたもので、値は male、female、other のいずれかです。分かる場合は必ず渡してください。仕組みと、対応が必要なフレーズの見つけ方 →

gender 引数を渡す ソースを表示 ↗
{{-- Pass the agreement argument alongside the value it inflects. --}}
@t('{username} has been invited', 'Team', [
    'username'        => $post->author->name,
    'username_gender' => $post->author->gender, // 'male' | 'female' | 'other'
])

性別がわからない場合は、'other' を明示的に渡してください。これが中立の分岐です。それでも指定がない場合は、ベース SDK が自動的に other の分岐を使用するため(langsys/langsys-php 1.3.1 以降、ext-intl の有無を問わず)、文は正しく読めます。

カテゴリ

カテゴリがフレーズの適用範囲を定めるため、同じ文言でもコンテキストに応じて異なる翻訳にできます。

{{-- Same word, two meanings — the category disambiguates. --}}
<strong>@t('Home', 'Main Menu')</strong>      {{-- "Inicio" --}}
<strong>@t('Home', 'Home repairs')</strong>   {{-- "Casa" --}}

マーカーの形式は1つだけ:{name}。JS SDKでは、単一の波括弧がJSXやVueのテンプレート構文と衝突するため、markup パラメーターには %name% を使用します。Bladeにはそのような衝突がないため、PHPでは常に標準の {name} 形式を使用します。これは、すべてのSDKで t() が使用する形式と同じです。

どれを使えばよいですか?

翻訳中… 使用 理由
Blade テンプレート内のテキスト。 @t(...) t() ヘルパーに HTML エスケープが加わっているため、テンプレートへ直接出力しても安全です。
それ以外の場所にある文字列(コントローラー、Livewire、ジョブ、メールなど)。 t() パラメーターが展開され、ICU の複数形が解決されたプレーンな文字列を返します。
絶対に翻訳してはいけないもの — ブランド名、コード、ID。 ラップしないままにする 対象範囲は明示的です。ラップした文字列のみが翻訳され、タグのない出力はそのまま通過します。
すでに文字列として持っている HTML ドキュメント全体。 Langsys::client()->translatePage() 素の PHP SDK のフルページパイプラインに切り替わり、タイトル、メタ情報、本文を 1 回の呼び出しで処理します。

目安:Blade → @t ・ PHP → t() ・ 触れられないもの → ラップしない。

サーバー上でのトークン検出

Langsys がまだ見たことのないフレーズをレンダリングすると、そのフレーズはキューに入り、レスポンスの終了後に登録されます。訪問者にはすぐにベース言語のテキストが表示され、フレーズはダッシュボードに翻訳可能な状態で表示されます。これには書き込みキーが必要です。読み取り専用キーの場合、キューへの追加は何も通知されずにスキップされます。カタログを変更すべきでない環境では、まさに望ましい動作です。

JS SDKとの組み合わせ

Inertia やハイブリッドアプリを使っていますか?サーバーがすでに取得したカタログを JS SDK に渡せば、クライアントが再度取得する必要はありません。フロントエンド SDK のページで説明している initialTranslations の受け渡しと同じ方法です。

サーバー — カタログを共有する ソースを表示 ↗
// app/Http/Middleware/HandleInertiaRequests.php
use Langsys\Laravel\Support\InertiaSsrProps;

public function share(Request $request): array
{
    return [...parent::share($request), ...InertiaSsrProps::share()];
}
クライアント — 再取得なしでハイドレーション
// resources/js — Vue shown; same shape for React/Svelte
import { LangsysApp, useLocaleStore } from 'langsys-js-vue';

const { store } = useLocaleStore(props.langsys.initialTranslationsLocale);
LangsysApp.init({
    projectid: import.meta.env.VITE_LANGSYS_PROJECT_ID,
    key: import.meta.env.VITE_LANGSYS_API_KEY, // read-only key on the client
    UserLocaleStore: store,
    initialTranslations: props.langsys.initialTranslations,
    initialTranslationsLocale: props.langsys.initialTranslationsLocale,
});

ファサードと生のクライアント

Langsys ファサードは t() に対応しており、Langsys::client() を使うと、フレーズの検索以外のすべての操作(カタログの読み取り、キャッシュ制御、コンテンツブロック)に使える基盤の langsys/langsys-php クライアントを取得できます。

ソースを表示 ↗
use Langsys\Laravel\Facades\Langsys;

Langsys::translate('Save', 'UI');            // same seam as t()
Langsys::client()->getTranslations('es-es'); // the vanilla langsys/langsys-php client
Langsys::client()->clearCache('es-es');      // pick up dashboard edits before the TTL
ドキュメントとラーニングセンターを検索