文字列1つ、あるいは小さな文字列オブジェクトを、今すぐ別の言語にしたい。フォームのラベル、通知、ユーザーが待っている短いUIコピーなどです。たった1回のやり取りのために webhook エンドポイントを立てたり、ジョブをポーリングしたりはしたくない。テキストを送って、その場で翻訳結果を受け取りたい。
そのためにあるのが、同期の Localize エンドポイントです。1回のリクエストで、同じ構造のまま翻訳済みデータが返ります。 ソースロケールとターゲットロケールを指定してキーと値のコンテンツをPOSTすると、エンジンの翻訳が完了するまで呼び出しはブロックされ、レスポンスでは値だけが翻訳され、構造はそのままの同じオブジェクトが返されます。追跡するジョブも、2回目の呼び出しも必要ありません。
これは単なる汎用モデルへの呼び出しではありません。設定済みのローカライゼーションエンジン、つまりその glossary、ブランドボイス、instructions、そしてロケールごとの モデル選択 を通して翻訳が実行されます。使われるのは async API と同じエンジンです。違うのは返し方だけです。async は1つのリクエストを複数のロケールに展開し、結果が揃い次第返します。一方この呼び出しは、1組のロケールだけを処理して、その場で結果を返します。
1つのロケールで、ブロッキング呼び出しでも問題ないなら、このページで合っています。
このエンドポイントは、単一のロケールペアが必要で、1回の往復を待てるときに使ってください。ターゲットロケールが多い場合、コンテンツが長い場合、あるいはロケールごとに失敗を分離したい場合は、async Localization API が適しています。こちらは1回のリクエストを受け取ると、すぐに 202 を返し、各ロケールを独立した耐久性のあるバックグラウンドワークフローとして実行します。レイテンシ以外の違いがもう1つあります。localization pipeline、つまり事前編集、人によるレビュー、逆翻訳、そのほかの任意ステージは async ジョブでのみ実行されます。この同期呼び出しでは、パイプライン設定は無視されます。
このページの内容
リクエスト#
POST /process/localizeX-API-Key ヘッダーで認証します。キーは組織スコープで、組織内のすべてのエンジンにアクセスできます。生成方法については Authentication を、完全なエラーモデルについては Errors and status codes を参照してください。
| パラメータ | 型 | 説明 |
|---|---|---|
engineId | string(任意) | ローカライゼーションエンジンID(eng_...)。省略した場合は、組織のデフォルトエンジンが使われます。 |
sourceLocale | string | BCP-47 ソースロケール(例: en)。 |
targetLocale | string | BCP-47 ターゲットロケール(例: de)。 |
data | object | 翻訳するキーと値のコンテンツ。ネストされたオブジェクトや配列にも対応しており、レスポンスは送信した構造をそのまま反映します。 |
context | string(任意) | この翻訳ペイロード全体に対する大まかなコンテキストです。たとえば、プロダクト上の表示箇所、対象読者、目的などが含まれます。 |
hints | object(任意) | キーごとのコンテキストヒント。キーは data のキーに一致し、値は文字列のパンくずリスト配列(例: { "nav.home": ["Navbar", "Home link"] })です。これにより、文字列がどこで使われるかをエンジンに伝え、短い文言や多義的な文言を適切に判別できます。 |
{
"engineId": "eng_abc123",
"sourceLocale": "en",
"targetLocale": "de",
"data": {
"greeting": "Hello, world!",
"cta": "Get started"
},
"hints": {
"cta": ["Landing page", "Primary button"]
}
}レスポンス#
レスポンスには、送信したものと同じ構造の翻訳済みコンテンツに加えて、それを生成したモデルとリクエスト単位のコストが含まれます。同じキーが、同じネスト構造のまま返ってくるため、コード側ではすでに知っている構造からそのまま翻訳結果を取り出せます。
| フィールド | 型 | 説明 |
|---|---|---|
sourceLocale | string | リクエストの内容をそのまま返した BCP-47 ソースロケール。 |
targetLocale | string | リクエストの内容をそのまま返した BCP-47 ターゲットロケール。 |
data | object | 入力と同じ構造の、翻訳済みキー・バリューコンテンツ。 |
model | string(任意) | この翻訳を生成した LLM model。形式は provider/model(例: anthropic/claude-sonnet-4.5)です。これを見れば、フォールバックチェーンの中で実際にどのモデルが使われたかが分かります。LLM 呼び出しが行われなかった場合は含まれません。詳しくは下のコールアウトを参照してください。 |
usage | object(任意) | トークン数と、リクエストごとのUSDコスト。LLM 呼び出しが行われなかった場合は含まれません。 |
usage オブジェクトには、この呼び出しのコスト内訳が含まれているため、別途請求情報を参照しなくても利用額を把握できます。
| フィールド | 型 | 説明 |
|---|---|---|
inputTokens | number | すべてのチャンクで消費された入力トークンの合計。 |
outputTokens | number | すべてのチャンクで生成された出力トークンの合計。 |
cacheReadTokens | number | モデルが報告する場合、プロバイダーのプロンプトキャッシュから提供された入力トークン数。 |
cacheWriteTokens | number | モデルが報告する場合、プロバイダーのプロンプトキャッシュに書き込まれた入力トークン数。 |
llmCost | number | 上流の LLM プロバイダーコスト(USD)。コストが報告されなかった場合は 0。 |
localizationCost | number | outputTokens から算出される、Lingo.dev のトークン単位のUSDコスト。 |
cost | number | リクエストの合計コスト(USD、llmCost + localizationCost)。 |
{
"sourceLocale": "en",
"targetLocale": "de",
"data": {
"greeting": "Hallo, Welt!",
"cta": "Jetzt starten"
},
"model": "anthropic/claude-sonnet-4.5",
"usage": {
"inputTokens": 2789,
"outputTokens": 861,
"cacheReadTokens": 0,
"cacheWriteTokens": 0,
"llmCost": 0.02129,
"localizationCost": 0.001722,
"cost": 0.023012
}
}`model` と `usage` が含まれない場合
data が空、つまり翻訳するキーがない場合、このエンドポイントは LLM を呼び出さずに即座に終了し、レスポンスには model と usage は含まれません。コスト関連のフィールドが欠けるのはこのケースだけで、その理由はコストが発生していないからです。何も翻訳されていないので、費用もかかっていません。翻訳が実行されたすべてのリクエストには、両方のフィールドが含まれます。パーサーではこれらを任意項目として扱えば、空入力ケースでも想定外にはなりません。
例#
同じ呼び出しを5つの言語で示します。分かりやすさのため、各例ではフラットなオブジェクトを送っていますが、data はネストされたオブジェクトや配列にも対応しており、レスポンスは送信した構造のまま返されます。
const response = await fetch(
"https://api.lingo.dev/process/localize",
{
method: "POST",
headers: {
"X-API-Key": "your_api_key",
"Content-Type": "application/json",
},
body: JSON.stringify({
engineId: "eng_abc123",
sourceLocale: "en",
targetLocale: "de",
data: {
greeting: "Hello, world!",
cta: "Get started",
},
}),
}
);
const { data } = await response.json();
// { greeting: "Hallo, Welt!", cta: "Jetzt starten" }ローカライズ時の処理#
1回の POST の裏側では、一連の処理が走っています。そして、それを知っておく価値があります。というのも、その処理こそが、出力を単発のモデル推測ではなく、既存のローカライズ済みコンテンツ全体と整合したものにしているからです。リクエストがこのエンドポイントに到達すると、エンジンは完全な設定を次の順序で適用します。
モデル選択 – ロケールペアに一致する中で、最優先の LLM model を選択します。ロケール固有のモデルは、ワイルドカード(
*)モデルより優先されます。プライマリモデルが失敗した場合、エンジンは次順位のモデルへ自動的にフォールバックします。ブランドボイス – ターゲットロケール用の ブランドボイス を読み込み、ロケール固有のものがなければワイルドカードのブランドボイスにフォールバックします。
Instructions – ワイルドカード instructions を含め、ターゲットロケールに一致するすべての instruction を読み込みます。
用語集検索 – 入力値を検索可能なチャンクに分割し、埋め込みを生成したうえで、エンジンの glossary に対してベクトル類似検索を実行します。一致した用語は厳密な訳語を強制するか、非翻訳語としてマークされ、そのまま通過します。
生成 – 構成済みのプロンプトを選択されたモデルに送り、その後 JSON レスポンスを解析・検証します。
これは async API がジョブごとに実行するのと同じエンジン処理パイプラインです。sync を async の代わりに呼び出しても変わるのは結果の返し方だけで、翻訳の生成方法は変わりません。つまり、ここで翻訳された文字列と async ジョブで翻訳された同じ文字列は、同じ用語集の用語と同じトーンに基づいた結果になります。
モデルのフォールバックは自動です。どのモデルが使われたかはレスポンスで確認できます
プライマリモデルが失敗すると、エンジンは順位順に次のモデルを試します。これは透過的に行われるため、どのモデルが翻訳を生成してもレスポンスの構造は変わりません。フォールバックが起きたことを示す唯一の手がかりは、レスポンス内の model フィールドです。チェーン内のどのモデルが特定のリクエストを処理したのかを正確に知りたい場合は、ここを確認してください。
