カテゴリトピックテンプレートのローカライズ

元の依頼について、具体的な実装のスケッチを追記します。方向性が妥当であれば、PRの作成にも協力できます。

問題点: カテゴリのトピックテンプレート(categories.topic_template)はローカライズできません。CategoryLocalization モデルと Localizable concern は namedescription しかカバーしておらず、AI コンテンツローカライゼーションのパイプラインもテンプレートを無視しています。そのため、コンポーザーはユーザーのロケールに関係なく、常にベースロケールのテンプレートが挿入されます。

ユースケース: 本番環境で Discourse AI コンテンツローカライゼーション(自動翻訳機能付き)を使用したバイリンガル(DE/EN)コミュニティを運営しています。投稿やトピックの翻訳はうまく機能していますが、構造化コンテンツ用のカテゴリテンプレート(チェックリスト付きのバグレポートフォーム、[event] BBCode を使った RSVP フローなど)は、機能的な BBCode が正確に1回だけ存在しなければならないため、言語ごとに複製できません。唯一の回避策は、読みづらいバイリンガルのラベル(例: “App-Version / App version:”)を含む単一のテンプレートを使用することですが、これはすべてのユーザーにとって読みやすさを損ないます。

提案:

  1. category_localizations テーブルに NULL 可能な topic_template テキストカラムを追加する
  2. コンポーザー: ユーザーの現在のロケールに対応するローカライズが存在する場合、そのテンプレートを使用し、なければ category.topic_template にフォールバックする
  3. カテゴリ管理 UI で、ローカライズされた名前や説明の隣に、ロケールごとにフィールドを公開/永続化する
  4. カテゴリを翻訳する際、AI コンテンツローカライゼーションのパイプラインに topic_template を含める(description と同様に)

マイグレーションは自明です(add_column :category_localizations, :topic_template, :text)。主な作業はコンポーザーの選択ロジックと管理 UI です。

検討した代替案:

  • バイリンガルの単一テンプレート(現在の回避策)— 機能的な BBCode ブロックがあると機能しなくなる
  • ロケールごとにテキストを注入するテーマコンポーネント — 脆弱で、サーバーサイドの検証がなく、API コンポーザーが壊れる