概要
v1.5.0 は、サイト間翻訳の運用で問題になりがちな複数の領域に踏み込んだ大型アップデートです。
- サイトをまたぐカテゴリ/フォルダ/カテゴリセットのマッピング
- 選択肢系フィールド(select/radio/checkbox)の値マッピング
- LLM タイムアウトの環境変数化
- 長い記事や多言語一括翻訳でも CGI/プロキシのタイムアウトに切られない分割翻訳パイプライン
- 非翻訳フィールド(数値・URL・日付など)の翻訳先へのコピー機能
- すべてのマッピング UI への「AI で候補生成」ボタンの追加
- 異なるコンテンツタイプ間(クロス CT)翻訳の正式サポート
新機能
サイト間のカテゴリ/フォルダ/カテゴリセット マッピング
翻訳先サイトが現在のサイトと異なる場合に、これまではスキップされていたカテゴリ/フォルダ/コンテンツデータの categories フィールドの ID を、明示的に対応付けて引き継げるようになりました。
- 翻訳設定画面に「サイト間のカテゴリ/フォルダ マッピング」セクションを追加。翻訳先サイトが現サイトと異なるときだけ表示されます
- モーダル UI で「記事」「ウェブページ」「コンテンツデータ」の3タブを切り替えて編集
- 3 つの初期化方法: ラベル名一致で自動マッチング/LLM 翻訳した名前で自動マッチング/手動編集
- コンテンツデータの categories フィールドは、フィールドマッピングから派生する「カテゴリセットの組」ごとに対照表が自動生成されます
- マッピングが無いソース ID は警告ログを残してスキップされます
選択肢フィールド(select/radio/checkbox)の値マッピング
これまで翻訳対象外だった以下のフィールド型の値を、ソース→ターゲットの値マッピングを通じて引き継げるようになりました。
- コンテンツフィールド:
select_box / radio_button / checkboxes - カスタムフィールド:
select_box / radio / checkbox
フィールドマッピング各行の「値マッピング...」ボタン(両側が選択肢型の場合のみ表示)からモーダル UI で編集できます。初期化方法は「名前で一致」「AI で候補生成」「クリア」の3つ。未マップ値は配列なら除外、単一値ならフィールドをスキップ、いずれもログに記録されます。
LLM タイムアウトの環境変数化
各プロバイダ(ChatGPT / Gemini / Claude)の HTTP リクエストタイムアウトを、以下の優先順位で 30〜1800 秒の範囲で設定可能になりました。
- 環境変数
AI_TRANSLATOR_HTTP_TIMEOUT - mt-config.cgi の
AITranslatorHttpTimeout ディレクティブ - プラグイン設定画面の「HTTP Request Timeout (seconds)」フィールド
- デフォルト 300 秒(v1.4.0 と同じ)
範囲外の値が指定された場合は警告ログを残してデフォルトにフォールバックします。
分割翻訳パイプライン
翻訳の実行を「プラン生成 → フィールドごとに翻訳 → 確定」の3段階に分け、フロントエンドから順次 HTTP リクエストを送る形に変更しました。
- 1 リクエストあたりの所要時間が「1フィールド分の LLM 応答」までに短縮されるため、Apache
ProxyTimeout や Nginx proxy_read_timeout 等のインフラ側タイムアウトに切られにくくなります - 翻訳ウィジェットにフィールド単位の進捗表示が表示されます(「翻訳中 3/12: タイトル」など)
- 「すべての言語に翻訳」モードでは「言語 i/N (config 名): フィールド j/M」が表示されます
- 既存の
ai_translator_translate / ai_translator_translate_json エンドポイントは後方互換のため維持されます
コピー対象フィールドマッピング(翻訳しない値の引き継ぎ)
数値・URL・日付・時刻・datetime・boolean・選択肢系(値マッピング無し)など、翻訳しないが翻訳先コンテンツへそのままコピーしたいフィールドの対応を設定する新機能です。
- 翻訳設定画面に 「コピー対象フィールドマッピング(翻訳しない)」 セクションを追加
- 「記事カスタムフィールド」「ウェブページカスタムフィールド」「コンテンツフィールド」の3サブセクションをそれぞれ独立して設定可能
- 翻訳マッピングと同じ「名前で一致 / AI で候補生成 / クリア」ボタンを各セクションに配置
- マッピング未設定時は ラベル名(コンテンツフィールド)/basename(カスタムフィールド)の自動マッチがフォールバック動作 するため、フィールド名を揃えていればコピーマッピングを設定しなくても値が引き継がれます
- asset(画像など)・categories・tags はコピー対象から除外しています(クロスサイトで ID が壊れるため、翻訳対象マッピング側で AssetCopier・カテゴリマッピングを通じて処理されます)
- text/textarea も選択肢には含まれますが「名前で一致」「AI で候補生成」では自動選出されません(翻訳対象マッピング側との二重設定を避けるため)
すべてのマッピング UI への「AI で候補生成」ボタンの追加
これまでカテゴリマッピング・値マッピングにのみ提供していた「AI で候補生成」ボタンを、翻訳対象フィールドマッピング 3 セクション + コピー対象フィールドマッピング 3 セクションにも追加しました。
- 候補マッチング方式の改善: LLM が単純に翻訳した訳語と target ラベルを照合する従来方式から、target 候補リスト全体を LLM に渡して semantic match を行う方式に変更しました
- 例: 日本語「サッカー」→ 翻訳先候補が
["Football", "Tennis"] の場合、LLM が「Football」を選択 - 例: 日本語「カテゴリ1」→ 翻訳先候補が
["Category1", "Category2"] の場合、空白の有無に関わらずペアリング成功
- target ラベルが翻訳先言語と異なる場合にも対応: ターゲットサイトのカテゴリ名やフィールドラベルが翻訳先言語ではなく英語名のままでもマッピングできます(運用ではこのケースが多数派です)
異なるコンテンツタイプ間(クロス CT)翻訳の正式サポート
翻訳元と翻訳先で異なるコンテンツタイプを指定する運用が安定動作するようになりました。
- 同じ CT の場合: 翻訳元の data を丸ごとコピーしてから翻訳対象フィールドを上書き
- 異なる CT の場合: コピー対象フィールドマッピング(ユーザー設定)または ラベル名自動マッチ(フォールバック)で非翻訳フィールドの値を引き継ぎ
- 翻訳先 CT に対応するフィールドが存在しない場合は値を破棄(保存先カラムが存在しないため)
UI / UX の改善
- 「フィールドマッピング」見出しを「翻訳対象フィールドマッピング」にリネーム: コピー対象フィールドマッピングとの対比が明確になりました
- フィールド名をローカライズして進捗表示: 「翻訳中 1/3: Body」→「翻訳中 1/3: 本文」のように、MT の標準辞書を通して翻訳対象のフィールド名がローカライズされます(カスタムフィールド・コンテンツフィールドはユーザーが設定したラベル名がそのまま使われます)
- 「全ての言語に翻訳」の挙動を変更: 同じターゲット言語の翻訳設定が複数あっても、すべての設定が順次実行されるようになりました(v1.5.0 ベータ版までは最初の 1 設定のみが実行されていました)。これにより「日本語→英語(同じサイト)」「日本語→英語(別サイト A)」「日本語→英語(別サイト B)」のような構成でも 3 つすべて実行されます
スキーマ変更
schema_version: 1.0008 → 1.0010translation_config テーブルに以下の列を追加(JSON 文字列、起動時に MT 本体が自動で ALTER TABLE を発行)category_mapping (TEXT) — サイト間カテゴリ/フォルダ/カテゴリセットのマッピングcopy_field_mapping (TEXT) — 非翻訳フィールドのコピーマッピング(v1.5.0 後半で追加)
新規エンドポイント
Mode | 用途 |
|---|
ai_translator_category_tree
| サイト/カテゴリセット内のカテゴリ・フォルダ一覧取得 |
ai_translator_translate_labels
| 短文ラベルの一括翻訳。candidates[] パラメータを渡すと target 候補から LLM が最適なペアを選ぶ(マッピング UI の「AI で候補生成」用) |
ai_translator_prepare
| 分割翻訳パイプラインのステージ1(ドラフト作成 + プラン生成) |
ai_translator_translate_field
| 同ステージ2(1フィールド翻訳) |
ai_translator_finalize
| 同ステージ3(Placement・convert_breaks の整合) |
ai_translator_rollback
| 分割パイプラインの巻き戻し(プラン中の全フィールドが失敗・スキップされた場合に新規ドラフトを破棄) |
互換性
- 既存エンドポイント維持:
ai_translator_translate / ai_translator_translate_json は v1.5.0 でも変わらず動作します。外部スクリプトからの呼び出しがある場合も影響しません - スキーマの自動アップグレード: 既存サイトでは MT 管理画面アクセス時に
category_mapping 列が自動追加されます。既存データへの影響はありません - 既存設定の振る舞い: マッピングが未設定のサイト間翻訳は v1.4.0 と同じく該当カテゴリ/フォルダをスキップし、警告ログを残します
- 進捗 UI: 単一フィールドのみのケース(短い記事など)でも分割パイプラインが動きますが、リクエスト数は十数回〜数十回に増えます。ご注意ください
アップグレード時の注意
- スキーマアップグレードが必要です: アップグレード後、初回の管理画面アクセス時に MT 標準のスキーマアップグレード画面が表示されます。「アップグレード開始」ボタンをクリックして
category_mapping / copy_field_mapping 列の追加を完了させてください - サイト間翻訳を使う場合は、アップグレード後に翻訳設定画面で「サイト間のカテゴリ/フォルダ マッピング」セクションを確認し、必要なマッピングを設定してください
- 異なる CT 間の翻訳で数値・URL・日付などの値も引き継ぎたい場合は、コピー対象フィールドマッピングを設定するか、翻訳元と翻訳先のフィールドラベル(コンテンツフィールド)/basename(カスタムフィールド)を揃えてください
- select/radio/checkbox を翻訳対象に含めたい場合は、フィールドマッピングを開いて「値マッピング...」を設定してください
- HTTP タイムアウトを延長したい場合は、システム設定画面の「HTTP Request Timeout (seconds)」または mt-config.cgi の
AITranslatorHttpTimeout で指定してください - 分割翻訳パイプラインは新しい挙動です。リクエスト数が増えるため、アクセスログのサイズが大きくなる可能性があります
既知の挙動(分割翻訳の中断時)
分割翻訳パイプラインは「フィールド単位の翻訳」を順次実行します。途中でブラウザを閉じる、ネットワークが切れる、または個別フィールドの翻訳が失敗した場合は、それまでに翻訳済みのフィールドだけが保存された下書き状態のターゲットが翻訳先サイトに残ります。
- 再実行: 同じ翻訳ボタンをもう一度押すと、既存の下書きを上書き対象として検出し、上書き確認モーダルが表示されます。OK を押すと残りのフィールドを含めて翻訳が再実行されます
- 破棄: 翻訳先サイトの記事/コンテンツデータ一覧から、該当の下書きを削除してください
- 公開状態は常に「下書き (HOLD)」で作成されるため、公開済みコンテンツが半翻訳の状態でサイト上に表示されることはありません