翻訳しないフィールドも翻訳先へコピー(連載 2/5)コピー対象フィールドマッピング
目次
AITranslator v1.5.0 の連載第 2 回です。今回は v1.5.0 で特にご要望の多かった「翻訳しないフィールドの値も翻訳先にコピーしたい」というニーズに応える機能、コピー対象フィールドマッピング をご紹介します。
これまでの課題
たとえば、次のようなコンテンツタイプを翻訳していたとします。
- タイトル(text)
- 本文(textarea)
- イベント開催日(date)
- 価格(number)
- 詳細ページ URL(url)
- カテゴリ
このうち、AITranslator が翻訳するのは「タイトル」と「本文」です。残りの「開催日」「価格」「URL」は翻訳対象ではないため、LLM には送られません。
ここで課題になるのが、翻訳先のコンテンツタイプが翻訳元と異なる場合(たとえば「Site Page」と「Site Page (de)」のように、似ているものの別物のコンテンツタイプ)です。これら非翻訳フィールドの値が翻訳先で空のままになってしまうケースがありました。コンテンツタイプ間でフィールドの ID が異なるため、AITranslator が「どのフィールドにコピーすればよいか」を判断できなかったのです。
実運用でも「翻訳先で日付が入っていない」「URL が空になっている」といった状況がたびたび発生し、そのたびに翻訳結果を 1 つずつ手作業で埋め直していました。地道で負担の大きい作業でした。
v1.5.0 では、この問題を新しい設定セクションでまとめて解決しています。
「コピー対象フィールドマッピング」とは
翻訳設定の編集画面に、「翻訳対象フィールドマッピング」とは別に 「コピー対象フィールドマッピング(翻訳しない)」 というセクションを追加しました。
ここでは、翻訳元のフィールドと翻訳先のフィールドのペアを設定します。翻訳実行時、AITranslator は指定されたフィールドの値を翻訳元から翻訳先へ そのままコピー します。LLM は呼ばれないため、トークンも消費しません。
対象になるフィールドタイプは次のとおりです。
- 数値(
number/integer/float) - URL(
url) - 日付と時刻(
date_and_time/datetime) - 日付のみ(
date_only/date) - 時刻のみ(
time_only/time) - 真偽値(
boolean/checkbox) - 選択肢系(
select_box/radio_button/checkboxesの値マッピング無し) - テキスト系(翻訳せずに引き継ぎたい場合)
セクションは「記事カスタムフィールド」「ウェブページカスタムフィールド」「コンテンツフィールド」の 3 種類に分かれており、それぞれ独立して設定できます。
操作用のボタン
各セクションには次のボタンが並んでいます。
- マッピングを追加: 空の行を 1 つ追加します
- 名前で一致: 翻訳元と翻訳先で同じラベル名のフィールドを自動でペアにします
- AI で候補生成: LLM が翻訳先候補から最適なペアを選びます(ラベル名が異なる場合に便利です)
- クリア: 設定済みのマッピングをすべて削除します
「名前で一致」は空白除去・大文字小文字無視で比較するため、「URL」と「url」のような表記の揺れも吸収します。
「AI で候補生成」は連載第 3 回で詳しく取り上げますが、概要だけお伝えすると「翻訳先のラベル名が翻訳元と大きく異なる場合でも、意味的に近いペアを LLM が選ぶ」という機能です。
設定しなくても動作するフォールバック
コピー対象フィールドマッピングは、空のままにしておいても動作します。
翻訳実行時、ユーザーが明示的にマッピングを設定していない場合は、AITranslator が自動でラベル名(コンテンツフィールド)または basename(カスタムフィールド)から対応するフィールドを探し、コピーします。
つまり、翻訳元と翻訳先で同じラベル名・basename を使っていれば、何も設定しなくてもコピーされます。明示的なマッピングが必要になるのは、ラベル名が異なる場合だけです。
このフォールバックがあるため、既存のサイトを v1.5.0 にアップグレードしても、設定の入れ直しは必要ありません。アップグレードするだけで、数値や URL も自動的にコピーされるようになります。
アセット・カテゴリ・タグはコピー対象から除外しています
選択肢には表示していませんが、画像・音声・動画・ファイルといったアセット系、それからカテゴリーフィールド、タグはコピー対象から意図的に除外しています。
理由は、これらをそのままコピーすると別ブログでは ID が成立しなくなるためです。たとえばアセットの ID はブログごとに割り振られているため、blog 45 の asset id=123 を blog 46 にコピーしても、そのアセットは存在せず、リンク切れになってしまいます。
これらは翻訳対象フィールドマッピング側で扱うべきもので、AITranslator は内部的に AssetCopier と カテゴリマッピング という別の仕組みを用いて、別ブログでも有効な ID に変換します。
そのため、コピー対象フィールドマッピングには「値をそのままコピーしても問題ないもの」だけが表示されます。
実際の翻訳結果
設定して翻訳を実行すると、翻訳先のコンテンツは次のようになります。
数値「42」、URL「https://example.com/ja」、日付と時刻「2026-05-20 10:30:00」、日付「2026-12-31」、時刻「23:45:00」が、そのまま翻訳先にコピーされています。テキスト系のフィールドはドイツ語に翻訳されているため、両者が共存していることが分かります。
タイトルとデータ識別ラベルもドイツ語になっています。「Roy's Kopiertest」「Titel: Kopiertest」「Der erste Absatz des Haupttextes」あたりが翻訳結果です。
URL や日付の値を翻訳時に書き換えたい場合
URL のパスを「/ja/」から「/en/」に置き換えたい、といったご要望もあるかもしれません。コピー対象フィールドマッピングは値をそのままコピーするシンプルな実装のため、現状こうした置換はサポートしていません。
代替として、URL を翻訳対象に含め、AI 翻訳プロンプトに置換ルールを記述する方法があります(v1.4.0 で導入したカスタムプロンプト機能を使います)。たとえば次のようなプロンプトを設定しておけば、LLM が URL のパスを書き換えます。
You are a URL rewriter. The input is a URL. Replace the language path
segment `/ja/` with `/en/`. Keep the rest as-is. Output only the URL.
{text}
ただし、URL のような構造化された値を LLM に渡す方法はどうしても不確実性が残ります。置換ルールが固定であれば、MT のテンプレートタグで処理する方が確実かもしれません。
まとめ
v1.5.0 のコピー対象フィールドマッピングは、これまで課題だった「翻訳先で数値や URL が空になってしまう問題」を解決します。
ポイントは 3 つです。
- 翻訳しないフィールド(数値・URL・日付・時刻・選択肢系など)を翻訳先へそのままコピーできる
- ユーザーが明示的に設定しなくても、ラベル名・basename での自動マッチがフォールバックとして動作する
- アセット・カテゴリ・タグはコピー対象から除外(cross-blog で ID が成立しないため、翻訳対象側の仕組みで処理)
実運用では「同じコンテンツタイプ の場合」「異なるコンテンツタイプ の場合」のどちらでも自然に動作します。
次回(第 3 回)は、各マッピング UI に追加した「AI で候補生成」を取り上げます。LLM が翻訳元と翻訳先のフィールドを意味的にペアリングする機能のご紹介です。